プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
あれ るびまが403で見れない
7 :
デフォルトの名無しさん :2009/08/08(土) 10:12:19
バージョンに関するよくある質問 Ruby 1.8.5 … レンタルサーバ等にいまだに残ってる古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい Ruby 1.8.6 … 過去の長期政権と数の暴力で一大勢力圏を維持中 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ Ruby 1.8.7 … 1.9 シリーズとのハイブリッドなバージョン、初学者にこそお勧め 1.9 系から輸入された機能は 1.8.6 では動かないが「1.8.6が許されるのは(AA略」と煽ってよい Ruby 1.9.0 … 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に Ruby 1.9.1 … 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中 おまけ Rubygem 0.x … 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
>>8 なんでも屋という表現が不安だが、投資のシステムから言ってたぶん Elona だろうと思われる
*band の見た目をちょっと綺麗にして非戦闘メインの生活もできるように作ってみたら
*band にハマるような人によってはヤバい依存度になる可能性があるものができたという話
ちなみに HSP 製だが、ファイル構成を見ないと HSP で作ったようには見えない
あと、回答は前者の「商品ページが増えて安い杖から高い杖までずらっと並ぶ(可能性がある)」だ
Ruby 1.8.7 は Ruby 1.9の新機能の中であまりにも便利だから、とても自然な機能だから、と言われていたものを Ruby 1.8.6に追加(フィードバック)したバージョン
>>9 > Rubygem 0.x
これって、パッケージで入れた後、gem update --systemでアプデトして使ってるんだけどマズイ?
>>10 サンクス Elonaか。昔、延々徹夜でお使いやってて、俺何やってんだろ、と思ったゲームだw
またやってみたくなったわ
スレ違いスマソ
>>13 gem --version できちんと最新版なら問題ない
apt を利用してると「apt 経由以外でプログラムを更新するのはやめてください」と言われるというだけ
主張はまったく正しいんだが、そう思うならパッケージの rubygem のバージョンとっとと上げろ(w
・ apt は勝手にプログラムが更新されることを許可しない
・ rubygem は自力更新がポリシー違反になるシステムを考慮してない
という結果だ
>>15 なるほど、そういうことかサンクス
> パッケージの rubygem のバージョンとっとと上げろ(w
そうだわなww
CentOS 5.3 で yum install ruby したら入ったのが 1.8.5 でびびったw こういう場合野良ビルドもやむなしだわな
Debian のtable, ubuntu9.04は 1.87 なんだな この辺が一番多いのかな。
20 :
デフォルトの名無しさん :2009/08/08(土) 23:00:31
正規表現の範囲指定繰り返し{m}のmの部分に、 \1, \2とかの後方参照を埋め込むことってできませんか? 例えば以下のような文字列strがあって、 str = "2foofoo" 2回fooが繰り返すということを意味しているときに、 str =~ /(\d)(foo){\1}/ というような書き方が0を返すようなことがしたいです。 後方参照の\1を数値の2と解釈させるような書き方ってありますか?
むしろできて欲しくない気もするな 数値をマッチさせてそれから正規表現を新規に作るしかあんめえ
str = "2foofoo" str =~ /(\d)/ str =~ /\d(foo){#{$1}}/ =>0 2行に分ければできるけど、1行でできるのかな?
23 :
デフォルトの名無しさん :2009/08/08(土) 23:55:29
>>20 仮に出来たとしても本来の意味の正規表現の能力を逸脱しすぎてて
逆に気持ち悪い機能だな
25 :
デフォルトの名無しさん :2009/08/09(日) 01:23:12
www::mechanizeに関する質問はスレチですか?
(\d)の部分が1-9なら、 /1(foo){1}|2(foo){2}|3(foo){3}|4(foo){4}|5(foo){5}|6(foo){6}|7(foo){7}|8(foo){8}|9(foo){9}/ でいける(マテ
> (マテ
>>25 別に構わないよ
Rubyでスレ違いになる可能性があるのはRailsの機能を使った場合だけ
それにしたって「Railsスレで聞けバカ」という誘導兼ツッコミが入るだろうし
質問一発目くらいは誰でも大目に見るだろ
29 :
25 :2009/08/09(日) 05:09:10
ありがとうございます じゃあ早速ですがfromのボタンを押すのは agent = WWW::Mechanize.new agent.get(uri).form_with(nameとかactionとか){入力する物}.click_button って形ですよねこのとき、nameが無くてactionも同じformがある場合はどうすれば良いんでしょうか?
いくらでも複雑に記述することは可能だが、ごく単純には抽出条件なしの配列を使う ブロックつきメソッドが動作しないのでメソッドチェーンできないことにだけ注意 Ruby 1.9.1 および 1.8.7 の Object#tap を使えば可能なはずだが、 tap はそういう用途に使うもんじゃねー # 従来(抽出条件記述が難しい) agent.page.form_with(抽出条件){|f| f.入力指示 }.click_button # 配列版(出現順だけ考える) f = agent.page.forms[2] f.入力指示 f.click_button # 配列要素を tap agent.page.forms[2].tap{|f| f.入力指示 }.click_button Page#forms は、Form オブジェクトを含む配列を HTML 上での <form> の出現順に返す あくまで配列なので、agent.page.forms[2] は HTML 上での 3 番目のフォームになるぞ
31 :
25 :2009/08/09(日) 05:31:34
なるほど、配列だから出てくる順番だけ考えて数を入れてやればいいわけですね。 やってみます。
Ruby 逆引きレシピとRuby逆引きハンドブックなら、どちらがおすすめですか?
>>32 個人的だが著者的に逆引きレシピをオススメしておく。
どうせどっちも読むようになるからどっちも買えというのが答ではあるんだが 逆引きのほうでいいんじゃねえの
どっちだよw
38 :
32 :2009/08/09(日) 22:06:05
>>33 >>36 ありがとうございます。
36さんに紹介していただいたブログを読むと、
どっちも買って損はなさそうなので、両方買うことにしました。
知っておくとちょっと得をするもんなにか教えてくれ。 当たり前すぎるが、pp。データ構造を見やすく出力。
||= 演算子 rakeの使い方 sortよりsort_byの方が劇的に速い
Module0::Class0 を継承して Module1::Module0::Class0 を作るにはどうすれば? どうしても無理ならクラス・モジュールの名前変えます。 ダメ元で試したコード: module Module0 class Class0 end end module Module1 module Module0 class Class0 < Module0::Class0 end end end エラー: NameError: uninitialized constant Module1::Module0::Class0 from (irb):7 from :0 環境: OS: Ubuntu 5.0 Kernel: 2.6.28-14-generic ruby: 1.8.7 irb: 0.9.5
>>41 名前変えた方がいいと思うけど
class Class0 < ::Module0::Class0
>>40 > sortよりsort_byの方が劇的に速い
「sortが遅い場合は」な
>>39 hashやstructを構造体みたいな使い方で大量に使う時の注意点
速度: Hash(キーがsymbol) > Struct > Hash(キーがstring) >>>(超えられない壁)>>> OpenStruct
45 :
デフォルトの名無しさん :2009/08/10(月) 10:32:18
ちょっとお聞きしたいのですが、 rubyでのgui開発で、 タブによって選択肢を選んだり、数値を代入して、 それをある形式で複数のテキストファイルに出力することはできますでしょうか。 いままでfortranしか触ったことがないのですが、 guiを作る必要がでてきまして、どのプログラムがいいか選んでいる状態 なのですが、もしよろしければ教えていただけると幸いです。
その程度どんなGUIでもできるでしょ >どのプログラムが・・・ 言語から選んでるってこと? 自分が使うだけ(もしくは使う人みんなRuby使い)ならRuby+何かGUIでもいいけど そうでないならコンパイルして実行形式にする言語を個人的には勧める
>>46 ありがとうございます。そういうのはどれでもできるんですね
実行形式できる言語というのをちょっと勉強してみます
IronRubyはダメ?
Ruby中級者であるなら何使ってもよい 初心者がRubyでGUIやるのはただのバカ
なんでもそれひとつで済ませられる何か、を求めてこそ 何か最後のひとつ以外を学んだら死ぬ、という呪いをかけられていてこそ プログラミング初心者 老害は立ち去れ
BASIC(接頭詞はなにでもなんでも可)であらゆる全てを作っていたあのころの夢を 今の人たちはRubyに見ているのだよ
使いやすいGUIビルダーと、充実した日本語ドキュメントがあれば
もはや「全部Ruby」で問題ないレベルまでは来てるんだけどな
最後に残った二つの関門が大きい
>>45 とにかく動けばいいと言うのなら、VisualBasicあたりをオススメする
後のことを考えてRubyでやりたいのなら
VisualuRuby+FormDesigner、WxRubyあたりを使うのがオススメ
>>53 winの話なの?それにしてもC#のほうがいいと思う
他のGUI言語でAPIの使い方を学び その知識を利用してRubyからAPIを直に呼ぶ というのが基本だと思う
Windowsの場合、APIを直に呼べばGUIプログラミングができるってもんでもないしなあ。 ウィンドウプロシージャをWindowsからどう呼ばせるかという最大の問題がある。
foo.xxx = foo.xxx + 123 で xxx に何入れても代入できる仕組みってできますか? property_missingで検索したらGroovyしかヒットしない…
Rubyに言語仕様としてのプロパティやアクセサというものは存在しない
あくまで「遠目に見ればそのように見えるかもしれない動作」を
単なるインスタンスメソッドで代用しているに過ぎない
>>57 設計思想自体に何か重大な誤りがあるようにしか見えないが、
とりあえずは foo の属するクラス定義の method_missing の中で分岐書くしかないな
「インスタンス変数が初めて使用されたときにアクセサメソッドを定義させることはできませんか」 というような質問は年に何回か見るな 動的言語を名乗ってる以上できても面白そうだが、現行では残念ながらできない クラス設計者が @foo = 100 とする代わりに毎回 instance_variable_initialize(:foo, 100) と書くようにする、みたいな 予防法的なめんどくさい手順しか思いつかん あ、 instance_variable_initialize は自作してね
OpenStructは?
そのへんは > foo.xxx = foo.xxx + 123 を実現するということがどんだけ重要で取替不可かによるな これの実現のためにどんだけの不便を強いる覚悟があるかみたいな
>>57 デフォルトの値が0っぽいから…
fooのクラスがFooとすると
class Foo
def initialize
@vals=Hash.new(0)
end
def method_missing(name,*args)
x=name.to_s
if name[-1..-1]=='=' then
@vals[name[0..-2]]=args[0]
else
@vals[name]
end
end
end
これでよかろうか(引数の数の検証は自分で書いてちょ)
class ZeroStruct < OpenStruct def initialize(*) super; @table.default = 0; end end foo = ZeroStruct.new
vim使っている人ってマイナーな人? それともメジャー? オススメってある?
66 :
デフォルトの名無しさん :2009/08/11(火) 14:05:22
エディタの話題は荒れるって
小学校の野外授業の注意プリントみたいだが、普段使っているものでよい Rubyのためだけに新規操作を覚えるとかマジキチ
┏┳┳┓ ハイ. ┏┳┳┓ ┏┫┃┃┃ .エディタの話は ┃┃┃┣┓ ┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃ ┃ ┃┃┏━━━┓┃┃ ┃ ┃スレチ ┣┫ . ・∀・ ┣┫. STOP!┃ ┗━━━━┛┗┳━┳┛┗━━━━┛ ┏┻┓┃ ┏━┛ ┣┻┓ ┗━━━┫ ┗━┓ . ┗━━━┛
AA厨うぜえ
70 :
デフォルトの名無しさん :2009/08/11(火) 14:38:00
厳密には「アスキー」アートではない。
ほら荒れた
×荒れた ○荒らした
専門板といえども、数行程度の目障りでないAAなら構わないと思うのだが。 それが嫌なら何で2chにいるの? 2ch以外にもコミュニティはあるよ?
久々に伸びてると思ったらこの内容かw 気に入らないレスをスルーできないと (掲示板を利用するのは)難しい
そもそもコピペでしか喋れない人間に価値はない
>>76 「そもそも」の使い方間違ってるぞ
スレの流れに沿って喋れない人間には価値が無いんだよ、これが
Matz曰く「Vimは史上最も無意味なプロジェクト」 ぼくの Vim への憎悪が意味するのは、ぼくが Vim のことを史上最大の 無意味なプロジェクトだと見ているということだ。 Vim がしばらくの間スローガンにしていたのに、 「ちゃんとした Vi」みたいなのがあったよね。 そんなスローガンでスタートしたら、もうどこにも行くところがない。 Vi をちゃんとすることなんて不可能だからだ。
79 :
デフォルトの名無しさん :2009/08/11(火) 17:05:26
>>78 s/Vim/Emacs/g にしてもあまり違和感がないと思うのは俺だけ?w
LinusがSubversionについて言った発言
83 :
デフォルトの名無しさん :2009/08/11(火) 18:42:24
つまんねーよ
ruby使いって性格最悪な人多いですね^^
ID出ないから自演し放題
86 :
デフォルトの名無しさん :2009/08/12(水) 09:31:23
>>78 s/Vim/Ruby/g にしてもあまり違和感(ry
>>86 escapeしたいのは何故?
escapeしたいものは何?
>>86 #!/usr/bin/ruby -Ke
require 'cgi'
require 'kconv'
# 仕様:1行掲示板なのでユーザーはHTMLタグを使えず、改行の自動置換等も行わない
# ログファイルがプレーンテキストでなくてもいいなら、ファイルにエスケープしたものを保存したくない
logfile = 'bbs_test.log'
log = File.open(logfile ,'r'){|f| f.read} rescue ''
post = CGI.new["datapost"]
if post
log = CGI.escapeHTML(post.toeuc) + "<br>\n" + log # postデータを追加
File.open(logfile, 'w'){|f| f.print(log)}
end
print "Content-type: text/html\n\n"
print <<EOF.toeuc
<html>
<head>
<title>rubyで一行掲示板</title>
</head>
<body>
<form method="POST">
一言:<input type="text" name="datapost">
<input type="submit" value="送信">
</form>
<hr>
#{log}
</body>
</html>
EOF
>>86 1. messageを行ごとに分解
2. 行ごとにescapeHTMLする
3. 行末に<br>をつける
4. 出力する
という処理をする必要があるんじゃないかな。
def text2html(str)
str.collect {|line| CGI.escapeHTML(line).sub(/$/, '<br>') }.join()
end
#{text2html(message)}
とかでどうでしょうか。
>>91 いまだに cgi-lib を使ったままのスクリプトを再利用してやる義理はねえよ
irb> require 'cgi-lib'
Warning:(irb):1: cgi-lib is deprecated after Ruby 1.8.1; use cgi instead
true
irb>
93 :
デフォルトの名無しさん :2009/08/12(水) 11:43:55
>>90 やってみましたが,変わりありませんでした..
>>92 これは元記事がそもそもかなり悪いな
わざわざ悪いやり方で学ぶ必要もあるまい
Ruby ユーザは CGI を書くなと言いたい (c) 弾
不足なのなら順に説明すればいいんじゃね夏休み、と思ったが 1ページ目であっさり挫折した
ttp://www.skuare.net/2007/06/ruby_1.html CGI の入力・出力構造は基本的に通常のスクリプトと変わらない
ブラウザからのデータをサーバが解釈した環境変数 QUERY_STRING の中身が標準入力に既に入っていて
標準出力を行うとユーザーに送る HTML などのデータとみなされてサーバが一旦受け取るという違いしかない
ただ、環境変数 QUERY_STRING を直接アクセスすることは今となってはまず無い
たいていは適度に使いやすく変換してくれる肩代わりライブラリ、Ruby では標準添付の cgi 、を使う
Web ブラウザは、HTML 上の送信ボタンが押されたときには、そのボタンを含む FORM 要素の
INPUT 要素や TEXTAREA 要素の name 属性と value 属性をペアにしてまとめ、適当にエンコードしてサーバに送る
上記サイトでは HTML 上で value が省略されているが、普通にユーザーが入力すればその値が value としてサーバに送られる
そして、サーバが受け取ったデータというのは通常
name1=値1&name2=値2…
というようなひと連なりのテキストというか英数字記号の巨大な塊となっている
これをいちいち安全かつ適切に自力分解復元するのは面倒だし不安なので、 cgi ライブラリにその仕事をやってもらう
CGI.new とすると QUERY_STRING が読み込まれ、わかりやすく分解されて、[ ] メソッドで参照できるようになる
たとえば HTML 上で name1 だった入力欄の値を利用したい場合は
cgi = CGI.new
cgi['name1']
とすればよい
なお、標準出力はサーバが全て受け取るので、何かをユーザー向けに表示させたい場合は、
本来 Web サーバが行っていたことも全て自力でする必要がある(CGI はそういうふうになっている)
HTML を表示したいのなら、 サーバが自動で行っていた Content-Type という HTTP ヘッダ等の表示も自前で行わなければならない
print "Content-type: text/html\n\n"
CGI#out のブロックで括るとこれを自動で行ってくれるのだが、まあそれは別の話
まずCGIの仕様をちゃんと紹介すべきだろう。
小飼先生が猛然とアップを始めました
>>96 標準入力経由でQUERY_STRINGを渡したり
標準出力への出力が勝手にHTMLとみなされるWebサーバなんてあるの?
まあ、作ればあるんじゃないかねえ
とりあえずあれだ、QUERY_STRING は HTTP GET で、標準入力は HTTP POST だ そういやなんでわざわざ分けたんだろうな、これ GET も POST も全部標準入力に渡せばよかったんじゃねーかと思うんだが、当時なんかあったのか
RESTでこのあたりの考えが再認識されてるけど、本来の意図は、 GETはリソースを取りに行くメソッド。 リソースの位置(※)を特定する情報としてquery stringが付く。 POSTは指定リソースに対して新たなリソースを作成させるメソッド。 作成する情報はリソースの位置(※)ではないのでURLのquery stringで はなくHTTPリクエストのBODYで指定する。 ※ URL = Uniform Resource Locator
文字列をマッチするときに =~ の右辺を別ファイルから参照させたいんだけど,どうすればいいですか?
いまいち質問がよくわからんけど re = Regexp.new("$d+") if s =~ re みたいにすれば動的に正規表現作れる
105 :
103 :2009/08/12(水) 17:48:43
例えば word.txtのなかに
apple
banana
cat
が入っていて,それが今後どんどん追加されていくときに
=~の右辺がwordのなかを一行ずつ読み込んでマッチしているか確認してほしいのです.
>>104 $dは特殊変数かなにかですか?
だからマニュアルか解説本くらい読めよ たいてい書いてあるからさ 文字列を正規表現オブジェクトにする方法はいくつかある リテラルとして直接書き込む方法 /hoge/ 変数として // 内で展開する方法 str = "hoge" /#{str}/ Regexp オブジェクトの明示的な生成 Regexp.new("hoge") 好きなの選べ
>>106 すいません.wordの中をgetsで取得しながらやってみます.
ありがとうございました.
>>105-
>>107 なにか話がすれちがっている気がする
>>103 ストップワードっていう奴ににているのかな?それを用意しておきたいの?
/¥b#{Regexp.union(File.read('words.txt').split)}¥b/ という話?
あああ、yen になってしまった。 ¥ ← これもなっちまうかな……
Regexp#=~とString#=~両方あるから右辺ってのが何かピンとこない
子飼団って、堀江もんの仲間で情弱のマカだった様な。
ビョーキの人にだけ悔しがってるように見える書き方をしたから。
× ビョーキの人にだけ悔しがってるように見える書き方をしたから。 ○ おちんちんびろーん
おちんちんびろーん
おまんまんがばーん
119 :
デフォルトの名無しさん :2009/08/14(金) 03:40:25
WinXPで1.8.6のwin32oleで、Excelよりデータの取得をする場合で質問です。 例えば、A1 〜 A5 を取得するには cells = sheet.Range("A1:A5") と書きますが、 データがある領域の全域を指定するにはどうしたら良いでしょうか? 行と列の数が5x3程度なら大したこと無いのですが、複数のシートが数千行x数十列の データを持っている場合だと毎回スクロールして端の位置を確認しなければならず不便です。 どなたかよろしく願います。
子飼団ってtwitterで、「いくぞ、ちんこぉぉぉぉぉぉぉぉぉぉぉぉ」とか、 「わしはでかいがあそこは小さい」とか「オ、オオオ、オ、奥野、奥野、奥野の肛門カッカッカカカツカヤツヤクカツ括約筋、ヒャー!」 」 とか言ってた奴だろ?下品すぎる信用できない
>>120 ,121
さんくす
VBAの要領でできるんですね。
Ruby通さないほうが書きやすいし正確だし速いんじゃね、とか思ったらこの支配からの卒業
>>122 酒飲んでたとしたら許せるレベルだな。
括約筋ごときで下品って言ってどうする。
ゴルゴ13は、マンガの中で
女スパイとエッチして、
「この括約筋はロシア女だな」と
スパイの母国を言い当てたんだぞw
自演醜い
ここまで全部電網親方の自演
下品な話はぴんくちゃんねるでどうぞ
130 :
デフォルトの名無しさん :2009/08/15(土) 16:08:48
Ruby1.9系でシーザー暗号プログラムを作っています。 1.8では文字列配列をFixnumとして扱えましたが1.9ではStringが帰ってきます。 今、each_byteを使ってますがもっとスマートな方法を教えてください
メールヘッダのMIMEエンコードはRubyではどうするのでしょうか? Perlでいう以下です。 use Encode; $text = "あ"; #ソースコードはcp932 Encode::from_to($text, "cp932", "MIME-Header-ISO_2022_JP"); print $text; #=>=?ISO-2022-JP?B?GyRCJCIbKEI=?=
>>131 text = NKF.nkf('-M','あ')
>>130 文字列配列をFixnumで扱うのくだりがさっぱりわからんが、
Ruby1.8のStringはたまたまバイト列だっただけだ
バイト列として扱いたければeach_byte等で回せ
1.9はpack unpackも使えないのか?
>>130 str.tr("A-Z", "B-ZA")
138 :
デフォルトの名無しさん :2009/08/16(日) 04:39:04
>>130 です
"aaaa".bytes.to_a[2]
のような形で、同じようなことができるようです。答えてくださったかたありがとうございました
スマートには見えんのだが…
子飼団ってテレビとかに出てるくらいだから本来下衆でしょ。まともなら低能なマスゴミとは距離を置いてる。
142 :
デフォルトの名無しさん :2009/08/16(日) 06:31:12
str.unpack('C*').collecgt {|x| x+i}.pack('C*') なら1.0でも1.9でも動く
144 :
デフォルトの名無しさん :2009/08/16(日) 20:07:42
質問です。 使用している端末エミュレータの高さ(行数)を取得するには どうすればいいのでしょうか?
146 :
144 :2009/08/16(日) 22:44:47
>>145 ありがとうございます。
Curses::lines でいけました。
147 :
デフォルトの名無しさん :2009/08/17(月) 00:26:17
class Parent attr_accessor :foo end class Child < Parent #... end という継承関係がある時、Childクラスではfooアクセッサーを 削除したいのですが、どうすればよいのでしょうか。 具体的に書きますと以下のように例外が発生してほしいです。 child = Child.new p child.foo #=> 例外発生!
Rubyにアクセサは存在しない ただのメソッドだ ということを踏まえると class Parent attr_accessor :foo end class Child < Parent undef :foo end Child.new.foo NoMethodError: undefined method `foo' for #<Child:0xb7d42530> from (irb):8 from :0
149 :
デフォルトの名無しさん :2009/08/17(月) 00:46:40
リスコフの置換規則に違反することになるかもしれないが、undef_method :foo, :foo= というのがある。
150 :
デフォルトの名無しさん :2009/08/17(月) 00:56:53
リスコフなんて糞くらえ。 ってか変数に型が無い言語で継承するって、実装の継承しか無いんだから undefでも好き勝手にしたらいいと思う。 え?俺OO分かってない?
>>147 の要求の時点でLSP無視なんだから何やっても構わんよ
特定のメソッドの有無に意味を持たせようとすること自体が邪悪
> Rubyにアクセサは存在しない このへんは後々尾を引いてくると推測
特定のメソッドの有無こそがオブジェクトの本質ぢゃないか。
Rubyにアクセサは存在しないっつーか、 アクセサは、作るもの(用意するもの)なんじゃねーの? あるメソッドがアクセサかどうかというだけで。
アクセサというシステム的なナニカがあるわけではない、という程度の意味なような気もする たとえば、Object#accessors でアクセサメソッドの一覧が返るとか def hoge と def hoge= と attr_reader :hoge と attr_writer :hoge を全部定義しても hoge() と hoge=() と hoge と hoge= で全部別個に使い分けが可能だとか
アクセサってのはインスタンス変数へのアクセスを提供する何かであって それが言語によってメソッドだったり属性参照式だったりするということじゃないの?
「Rubyにはアクセサという機構は存在せず、メソッド定義で代用する」 「定義の簡便のためにattr*系のメソッドがあるが、メソッド定義以上のことを期待するのは勘弁してください」 こう書けばよかったんだな
>>162 が想定する他の言語のアクセサってどんなの?
アクセサが言語レベルで実装されてる言語なんてあるのか?
def attribute=(value) これって明らかにアクセサ用の機能だろ
初心者ですがまったく話がわかりません
確かに、メソッド名の最後に(だけ)は = が使えるとか、 obj.foo = bar が obj.foo=(bar) の意味である、だとか、 言語レベルの機能だよな。
テストファイルで Enumerable を拡張してるんですが、これってテストにならないですよね?
Array#include?だと指定した値と等しい要素がある場合trueを返しますけど、 等しい要素数を返すにはselectで条件を満たす要素だけとりだしてそれのsizeを調べるしかないでしょうか?
>>170 その通りです。
便乗して質問させて下さい。
include? ってなんで Array で再定義してるんでしょうか?
Enumerable#include? とは違う実装になってるんでしょうか?
まあ基本的にはそう grepしてもいいが、「一致する要素の数」というのを直接返すメソッドはない というかもしあったとしても内部でfind_allしてsize求めるはず
例として非nilを数える場合 [true,false,1, "a",nil,nil].inject(0){|r, i| r += (!i.nil?) ? 1 : 0} 書いてみたはいいけど汚いなぁ
>>171 rb_ary_includesが遅いと困るからきちんと作ったのだと推測
NTFSの副ストリームって対応してる?
>>174 なるほど。Array#include? をネイティブに書いて少しでも性能をだそうとした
ということですね。
でも。。今 ruby-1.9.1-p129 の array.c 見てみたんだけど、すごく当たり前な
実装なんですね。
この程度でもネイティブ化すると結構速くなるものなんですかね?
わざわざEnumerableで定義したのを探してアクセスする時間が惜しいからそばに入れたんじゃね
>>175 Windows版Rubyとして何かをしたという話は聞かない
コンパイルしたときに自動で何かがどうかできるのなら対応してるかも
>>175 これで足りる?
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
open('foo.txt', 'w'){|f| f.write('in foo.txt') }
open('foo.txt:sub', 'w'){|f| f.write('in foo.txt:sub') }
puts File.read('foo.txt')
puts File.read('foo.txt:sub')
179 :
デフォルトの名無しさん :2009/08/17(月) 21:44:20
>>173 低脳死ねカス
[true,false,1, "a",nil,nil].cmplact.length
>>179 低能氏ねカス
s/cmplact/compact/
181 :
デフォルトの名無しさん :2009/08/17(月) 21:54:05
cmplact?
length厨はマジでどうにかならんものか
size の方が好きなのけ?
>>170 sizeを調べる「しかない」わけではない。
cnt = 0
array.each {|x| cnt += 1 if some_condition(x) }
puts cnt
あまり美しくないけど、どうぞ。
用途によって変えるっていう当たり前の答えが返ってくるとは思うけど・・・・ ary=["hage","hige","huge","hege","hoge"] の要素数を出力したいときに p ary.size これはaryを後で別の処理が行われると思われる場合でしょ んで、 p ["hage","hige","huge","hege","hoge"].size これは確認したい時だけでしょ んで、 ary_num=ary.size p ary_num ってやってる人がいるんだけど,これは変数が説明になってるってこと? どの段階で処理したものを変数に入れるかってのがわかんない。好き好きかな?
>aryを後で別の処理が行われると思われる場合 これは ["hage","hige","huge","hege","hoge"] の要素数を出力したいときに ary = ["hage","hige","huge","hege","hoge"] p ary.size という感じ aryに代入するのが前提なら、一番目は最も素直 二番目は主に説明・動作確認・デバッグで使われる 代入するのもめんどくさいとかスペース減らしたいとかそういうのが主な理由 三番目は正直くどい でも説明以外にも値をキャッシュしておきたいケースはあるし、そういう時には避けられない
二番目は説明というかスレや記事とかでの解説だった
189 :
186 :2009/08/17(月) 23:03:10
190 :
デフォルトの名無しさん :2009/08/18(火) 00:40:37
191 :
デフォルトの名無しさん :2009/08/18(火) 00:54:11
>>190 低脳死ね。置換できてない。
cmplact => cmpact
正しくは
compact
^
192 :
チンパンジー愛ちゃん :2009/08/18(火) 02:24:08
>>191 うきっきーきーきぃっ
>>175 C:\> dir a.txt
(略)
2009/08/18 09:46 0 a.txt
(略)
C:\> ruby -e "open('a.txt:foo', 'w'){|f| f.write 'abc'}"
C:\> dir a.txt
(略)
2009/08/18 09:46 0 a.txt
(略)
C:\> ruby -e "p IO.read('a.txt:foo')"
"abc"
195 :
デフォルトの名無しさん :2009/08/18(火) 14:13:54
くだらない質問だと思いますが、文字列 a = "001011" b = "000111" から c = "000011" を求める(論理積?)にはどうしたら良いのでしょうか?
irb> a = "001011" irb> b = "000111" irb> ax = a.split(//n) irb> bx = b.split(//n) irb> p (0..5).to_a.map{|i| ax[i].to_i & bx[i].to_i}.join "000011"
197 :
チンパンジー愛ちゃん :2009/08/18(火) 14:30:51
def and_str(a, b) return (Integer(a) & Integer(b)).to_s(2) end
198 :
チンパンジー愛ちゃん :2009/08/18(火) 14:33:05
def and_str(a, b) return (Integer("0b" + a) & Integer("0b" + b)).to_s(2) end
>>196 1.9 だけでいいなら a[i] で分割いらないんだけどな
どっちでも動作させるならまだ split がスレ的に無難か
めんどい負の遺産じゃのう
200 :
195 :2009/08/18(火) 14:45:00
>>196-199 ありがとうございました! 196が自分には理解しやすい一方、
198の方が速そうに見えるのですが(こちらはpaddingが必要ですね)
大量のデータを処理する際には、違いが出るでしょうか。
100万桁を0.5秒で処理しないと銃殺されるとかそういう時にはチェックが必要
202 :
195 :2009/08/18(火) 15:03:24
そこまで深刻じゃないので、また両方試してみます!
ハッシュがよくわからなくなったので質問させていただきます h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>0,"b"=>0,"c"=>0} } となって次に "usa"=>{"a"=>1,"b"=>1,"c"=>0}が出たら h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} } となってほしいのですが,どうすればいいでしょうか? 説明が分かり辛いですが・・・ ループ内にハッシュのキーが一致したら加算していってほしいのです
>>170 1.8.7以降なら Enumerable#count(obj)
>>203 とりあえず usa = {"a"=>1,"b"=>1,"c"=>0} を h["usa"] に加算する場合
h["usa"].merge!(usa) { |k, s, d| s += d }
{ "usa" => {"a"=>1,"b"=>1,"c"=>0} } でやりたいなら適当にネストさせて
代入いらねーよorz h["usa"].merge!(usa) { |k, s, d| s + d }
>>198 def and_str(a, b)
sprintf("%.*b", [a.length, b.length].max, (a.to_i(2) & b.to_i(2)))
end
>>203 最初はとにかくやりたいことをそのまま書くといい
多くの場合、そのまま実行しても充分に速い
def add(base, key, val)
if tgt = base[key]
val.each_pair do |k,v|
if tgt[k] then
tgt[k] = tgt[k] + v
else
tgt[k] = v
end
end
else
base[key] = val
end
end
h={"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>0,"b"=>0,"c"=>0}
}
add(h, 'usa', {"a"=>1,"b"=>1,"c"=>0})
p h
{"ja"=>{"a"=>1, "b"=>1, "c"=>0}, "usa"=>{"a"=>1, "b"=>1, "c"=>0}}
209 :
203 :2009/08/18(火) 16:27:26
>>205-206 ,
>>208 ありがとうございます。mergeを使ったりやaddを定義するのですね。
本当は
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
hc =Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
pp b
b.each {|count| hin[count] +=1}
hout[ary[i]] = hin
puts "@@@"
pp hout
puts "@@@"
}
pp hout
こんなことをやってます。
最後の pp houtが自分の思ったものと違っていて悩んでいます.
完全質問だと悪いと思って203で質問しました。
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) どうしたらいいんでしょう><
>>210 正しいMeCabバインディングを使う
Taggerは今SourceForgeにあるMeCabバインディングをそもそも知らない
>>211 hm..
ってことはMeCabがバージョン9.07ではダメってことで、
古いバージョンのMeCabでおk って解釈でいいんですかね?
6年前のな
MeCab本体とMeCabライブラリは違う
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) Possible C/C++ prototypes are: Tagger.new(char const *argc) Tagger.new() 少しいじった結果エラーログがこうなりました・・。 これはスクリプト書き換えとかで回避できないんでしょうか?
216 :
203 :2009/08/18(火) 21:30:24
>>205-
>>206 ,
>>208 さんのもの自体は理解できたのですが,
やはり
>>209 での問題が解決しませんでした.
ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.
どんな値が返ってくれば正解なのかすら知らせずに丸投げとな require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| b = ary[i + 1, window].delete_if{|w| /#{ary[i]}/ =~ w} b.each do |w| hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout {"w1"=> 10, "w2"=> 9, "w3"=> 11, "w4"=> 9, "w5"=> 6}
require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| ary[i+1, window].each do |w| next if /#{ary[i]}/ =~ w hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout
require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new(0) ary.size.times do |i| ary[i+1, window].reject{|w| w == ary[i]}.each{|w| hout[w] += 1} end pp hout
220 :
203 :2009/08/18(火) 22:30:53
>>217-
>>218 すいません。欲しい出力を書いていませんでした。申し訳ありません。
{"w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
"w2"=>{"w1"=>4, "w3"=>5, "w4"=>2, "w5"=>1},
"w3"=>{"w1"=>4, "w2"=>2, "w4"=>3, "w5"=>2},
"w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w5"=>1},
"w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1}}
と出力して欲しいのです。
221 :
チンパンジー愛ちゃん :2009/08/18(火) 23:01:40
require 'pp' def hash_add(base, add) ret = add.each do |nest_key, nest_value| if base[nest_key] nest_value.each do |add_key, add_value| base[nest_key][add_key] += add_value end else base[nest_key] = nest_value end end return base end h1 = { "ja"=>{"a"=>5,"b"=>7,"c"=>9}, "usa"=>{"a"=>4,"b"=>2,"c"=>1} } # $(B$H$J$C$F<!$K(B h2 = { "ja"=>{"a"=>3,"b"=>8,"c"=>4}, "usa"=>{"a"=>14,"b"=>8,"c"=>5} } # $(B$,=P$?$i(B pp hash_add(h1, h2) # h1.inspect h = { "ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} }
require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h } window = 6 hout = Hash.new ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } end
223 :
チンパンジー愛ちゃん :2009/08/18(火) 23:25:03
核と思われる部分だけを抜き出すとこんなことになるんだけど、 問題をうまくまとめれてないんじゃない? もうちょっと整理してから再度質問して。 require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 ary.size.times { |i| j = i + 1 p [":ary[#{j},#{window}]", ary[j, window]] } t217.3.rb [utf-8][unix] :!ruby t217.3.rb [":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]] [":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]] [":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]] [":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]] [":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]] [":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]] [":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]] [":ary[8,6]", ["w5", "w2", "w3", "w4"]] [":ary[9,6]", ["w2", "w3", "w4"]] [":ary[10,6]", ["w3", "w4"]] [":ary[11,6]", ["w4"]] [":ary[12,6]", []]
224 :
チンパンジー愛ちゃん :2009/08/18(火) 23:25:52
ary[12, 6]がおかしいと思わない?
225 :
203 :2009/08/18(火) 23:44:32
>>221-
>>224 ありがとうございます。
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と
同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。
mergeの方法は
>>205-206 ,
>>208 さんのやり方になるのかなと思ってます。
>>224 ary[12,6]はそれでもOKだと思ってます。
そこは加算しなくていいよーということで。だめなんでしょうか?
226 :
チンパンジー愛ちゃん :2009/08/18(火) 23:45:41
>>215 @mecab = MeCab::Tagger.new([$0])
ってかいてあるところに
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
みたいな感じで直接Mecab用のオプション書けばうまくいくよ
227 :
チンパンジー愛ちゃん :2009/08/18(火) 23:53:51
>>225 ary[12, 6]をきちんと認識しているのなら何も問題はないでふ
ただ、ここがバグの原因じゃないかな?と思っただけで。
Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、
h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
以下のコードの実行結果の予想つく?
h0 = Hash.new(0)
hash = {}
p h0[:unknown_keh0 = Hash.new(0)
hash = {}
p h0[:unknown_key]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
y]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
228 :
チンパンジー愛ちゃん :2009/08/18(火) 23:55:27
上のはゴミコードが入っちゃった。ごめん。 こっちのコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
229 :
チンパンジー愛ちゃん :2009/08/18(火) 23:57:18
rails仙人やーい
>>228 0
5
0
5
では・・・・ないんですか?すいません。
あと:unknownという表記になれていませんのでそこがわかりません。
windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。 No such file or directory - .\/log.txt (Errno::ENOENT) このようになります。 ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。 その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか
>>226 @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
と書いてみましたが・・。
何を見て何のオプションを書き加えていけばいいんでしょうか・・?
>>231 原因がわかってるように見えるので、むしろ何がわからないのかわかりません
適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど
234 :
チンパンジー愛ちゃん :2009/08/19(水) 00:16:39
>>230 :aaaとかはシンボルっていうんだけど、
シンボルが難しいんならいいや以下のコードで考えて。
h0 = Hash.new(0)
hash = {} # Hash.new と等価
p h0["unknown_key"]
p h0["unknown_key"] += 5
p hash["unknown_key"]
p hash["unknown_key"] += 5
実行結果の予想は間違ってるよ。
0
5
nil
h.rb:6: undefined method `+' for nil:NilClass (NoMethodError)
自分で確認してね。
あとさ、Hash.newの挙動が分かってないので、Hashの初期化について学んで来てください。
>>231 それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う
でなければよほど面倒なことをしてるソースか
どちらにせよソース提示が必要かと
236 :
チンパンジー愛ちゃん :2009/08/19(水) 00:27:23
>>232 ええーっ!
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
ってほんとうに実行したの?
argの意味が分からない系のヒトなのか
チンパンジー愛ちゃんでもできたのにねー
まあ、いいや。
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。
# 個人的な興味として何でghotiなんて使おうと思ったの?
237 :
チンパンジー愛ちゃん :2009/08/19(水) 00:28:38
追加で、ruby, mecab, mecab-ruby, mecab用辞書 これらすべてのインストール方法も書いてね。
238 :
203 :2009/08/19(水) 00:30:44
>>234 ありがとうございます。シンボルですか。了解です。
h0 = Hash.new(0) #ハッシュh0を作り初期値は0
hash = {} # Hash.new と等価 #ハッシュhashを作成(ハッシュの箱を作っただけ)
p h0["unknown_key"] #h0のkeyをunknown_keyとしてそのvalueを出力->初期値0
p h0["unknown_key"] += 5#↑のkeyのvalueに5加算
p hash["unknown_key"] #hashのkeyをunknown_keyとしてそのvalueを出力->でも中身が入ってないからnil
p hash["unknown_key"] += 5 #↑中身がわかってないのに5たしてんじゃねーよ
ということですね。少しわかりました。
239 :
231 :2009/08/19(水) 00:30:53
エラーの行は from ******.rb:444:in `open' from ******.rb:444:in `store_text' def store_text(lines) ary = [] lines.each do |line| ary << line.gsub(/\s+/, ' ').strip ←ココ 444行目 end ary.each do |line| @text << line end File.open(@text_filename, 'a') do |fp| ary.each do |line| line.chomp! fp.puts line end
240 :
231 :2009/08/19(水) 00:31:59
from ******.rb:239:in `memorize' def memorize(lines) @dic.store_text(lines) ←ココ239行目 if @dic.learn_from_text @dic.save_dictionary end end from ******.rb:779 require 'readline' ←779行目 ****** = ******.new(".\\") puts "Welcome to The ******" while (str = Readline.readline("> ", true)) break if /^(exit|quit)?$/.match(str) ******.memorize(str) res = ******.talk puts res end ******はファイル名です。
>>231 =
>>239-240 @text_filename
この中身をセットしている所をチェックしてみれば?
もしくは単純に、
File.open(@text_filename, 'a') do |fp|
の直前で、
p @text_filename
してみるとか。
まあごっつい原始的なデバグ法で気が引けるが。
人工無脳流行ってんの?
>>240 その*****とやらのクラスのinitializeの第一引数どうなってる?
>****** = ******.new(".\\")
の .\ に log.txt を結合してるんだと思う
244 :
242 :2009/08/19(水) 00:42:50
>>243 をお。
ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ
245 :
195 :2009/08/19(水) 00:49:25
流れをぶったぎってすみません。ちょっと質問。 配列のデフォルト値の指定ってできますか? ハッシュ(デフォルト値==0)だったら hoge = Hash.new(0)だけど 配列は同じ構文で要素数指定になりますよね。 ary = [] ary.default(0) ary[3] #=> 0 みたいなことがやりたいのです。
246 :
231 :2009/08/19(水) 00:51:06
def initialize(dirname) def initialize(dirname=nil) def initialize(buf) def initialize(ary=nil) 第一引数がわかりません>< ruby難しいですorz
247 :
チンパンジー愛ちゃん :2009/08/19(水) 00:51:50
>>239 なんだー?それは。
ghoti.rbが実行できないわけではないのか。
ココ444行目とかかかれても何のエラーか分かんねーよ。
どーせnilがsub呼んだってエラーだろーけどなー
239行目は分からない、でも@dicをみるにmecabの辞書をインストールしてないんでしょ。
779行目はreadlineっていうライブラリがないってだけでしょ。
で、そういうライブラリなし・辞書なしとかのエラーだと予想したからこそ、
>>236-237 の
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。
追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。
って質問を書いておいたんだけどな。
どうやってインストールされていたか分からないなら分からないと正直に書いて。
とりあえず答えてくれれば解決方法を伝えるようにがんばるけど答えないなら知らない。諦めてね。
>>203 (208)
>>227 で愛ちゃんが書いた以下のコードを理解してもらいたくって
>>228 ,
>>234 を書いたってことを理解してね。
-------------------------------------
Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
248 :
チンパンジー愛ちゃん :2009/08/19(水) 00:53:11
およよ、書かれてた。ごめんね。
リロードせずに書いちゃった。
>>247 はとりあえずキャンセル
249 :
チンパンジー愛ちゃん :2009/08/19(水) 00:59:00
愛ちゃんかわいいよ愛ちゃん てかコテハンうぜぇw
251 :
231 :2009/08/19(水) 01:09:23
****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・
252 :
231 :2009/08/19(水) 01:10:30
むりですね。。
>>251-252 なんか吹いた
******.new (".\\")
のコード(initialize)を出せって言われとろーがwww
大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
254 :
チンパンジー愛ちゃん :2009/08/19(水) 01:15:11
>>247 何でUbuntu9.04にruby1.84が入っているんだ。
私も9.04使ってるけどruby1.87が入ってたけどな。
それとリンク先はpythonの説明だったぞ。
なぜruby使いにpythonの記事を読ませた!死罪也!
まさかとは思うけど、pythonとrubyの区別がついてなくて
リンク先の記事はrubyの解説だと思っているってことはないよね?
@mecab = MeCab::Tagger.new
って実行してエラーメッセージを貼ってね。
個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。
あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
255 :
231 :2009/08/19(水) 01:25:16
>>253 ******は同じ文字列です。。
コードのだしかたが・・。
module ******
def ******.new(*args)
******::Core.new(*args)
end
def ******.init_dictionary(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.learn_from_text(true)
dic
end
class Dictionary
TEXT_FILENAME = '******.txt'
DIC_FILENAME = '******.dic'
def Dictionary.load(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.load_dictionary
dic
end
こうですか?わかりません><
256 :
203 :2009/08/19(水) 01:25:22
>>247 >Hash.new(0)
>してあるんだから、
>「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
>は、h["unknown_value"] += unknown_value_key
>と直接書けばよいでしょ。
すいません。ここが理解できてないです。
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
pp hin
puts "@@@"
pp hout
puts "@@@"
}
pp hout
-------
hout[ary[i]] += hin.valuesだとhoutは初期値がないから
undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
>>255 おk。わかった。
とりあえず、
>>231 に戻って
******.new (".\\")
を
******.new (".")
にしてみろ。
それでダメなら、ちゃんとソース嫁。
258 :
231 :2009/08/19(水) 01:29:39
>>257 ネ申
ありがとうございます。ありがとうございます。
>>258 怖い、怖いよw
本当にそれでいいか、一度ソースを読むことを激しくお勧めする。
てかRubyほとんど関係ねえ!
>>259 文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。
あとはPerlでの作業なのでなんとかなるでしょう。。
Ruby難しいです・・。ソース読めません・・。
>>203 >>222 だけどあれじゃだめなの?それとも途中経過の出力が必要?
ary.each_with_index do |key,i|
(hout[key] = zero.dup).delete(key) unless hout.key?(key)
ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
pp hout[key],'@@@',hout,'@@@',
end
pp hout
262 :
203 :2009/08/19(水) 01:47:10
>>222 ありがとうございます。出力結果はOKですし、ソースも読解します。
でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので
チンパンさんに教えてもらっている感じです。
263 :
チンパンジー愛ちゃん :2009/08/19(水) 01:57:45
>>256 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
以下の時にA.B.と分けて考えよう。
h1 = hash.new(0)
h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可
h2 = {"a" => 3, "c" => 8}
A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算
B.なければmergeする
A.これは、以下のままでよいから特に難しくないね。
h1["a"] += h2["a"]
B.は
h1["c"] += h2["c"]
と等価なんだよね。
p h1["unknown_key"] += 5
を思い出してね。
すると、A.Bの時に場合分けは特に必要なく、
h["unknown_value"] += unknown_value_key
のコードで事足りるよね。
264 :
203 :2009/08/19(水) 02:16:49
>>263 A,Bの場合分けが入らないのは理解しました。
h["unknown_value"] += unknown_value_key
これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか?
アンダースコアをどのように使っているかわかりません。
hout[ary[i]] とやらないと
w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}
のw1=>が得られないと思っているのですが、それもちがいますか?
265 :
231 :2009/08/19(水) 02:19:29
else chr = /./m.match(str)[0] result << chr if num str = Regexp.last_match.post_match end この部分で ぬるぽ って言われるんですが。 NilClass (NoMethodError) 単なる文法間違いですか・・?
>>262 「自分で書いた」ってのは
>>209 の事かな
あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。
hout[ary[i]] = hin
ここに
>>208 氏のメソッドを使えば
>>220 に近い結果が出せた。
add(hout,ary[i],hin)
マージに拘りすぎ、普通に枚挙すれ
267 :
チンパンジー愛ちゃん :2009/08/19(水) 02:30:13
>>264 アンダースコアは気にしないで。単語の区切りに使っただけ。
こっちの方が迷わなくていいかな。
×h["unknown_value"] += unknown_value_key
○h["unknownkey"] += unknownvalue
これはhのハッシュに存在していないキーのことをいいたかったんだけど、
愛ちゃんの変数名の付け方がおかしかったね。ごめんね。
> これは ハッシュhにunknownのvalueをkeyとしたものに
> unknownのvalueのkeyのvalueを足しているということでいいんですか?
話がややこしくなってるね。変な変数名でごめんね。
> hout[ary[i]] とやらないと...
これは正しいよ。そうしないと得られないよ。
268 :
203 :2009/08/19(水) 03:10:28
>>266 ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。
>>267 変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。
269 :
チンパンジー愛ちゃん :2009/08/19(水) 03:51:55
> しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と > 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね うんにゃ、違うよ。hinじゃないよ。 h["unknownkey"] += unknownvalue と結びつけて考えないといけないのは以下の箇所 hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず hin.each do |key, value| hout[ary[i]][key] += value end
的確なレスもできないくせにコテうぜえ
ナツノオモイデ君はどこでも厄介だ
>>265 本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
>>245 arr = Array.new
p arr[3] #=> nil
これを「nil ではなく 0」にしたいのだと推測
できません
「arr[3] が nil なら 0 を代入」という手順を経るのが通例です
この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます
配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは
「nil以外のオブジェクトが勝手に若い要素全てに代入される」
という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう
もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか
arr = Array.new(5)
arr.fill{ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]
あるいは new のときにやっちゃってください
arr = Array.new(5){ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]
[] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
>>245 Rubyの配列にはそういう機能がないです。残念でした。
代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。
たとえば
arr = [1, 2, 3]
puts (arr[5] ||= 0) + 1
みたいな。
あとは Array#[] を上書きすればいいのかなー
class Array
def [](x)
val = super(x)
val = self[x] = 0 if val.nil?
return val
end
end
とか。
275 :
203 :2009/08/19(水) 11:43:54
>>263 遅くなってすいません。こうですか?
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
hin.each do |key, value|
hout[ary[i]][key] += value
end
}
pp hout
実行すると
at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
from mat.rb:11:in `each'
from mat.rb:11
from mat.rb:5:in `times'
from mat.rb:5
となってしまいます。
>>275 自分で考えてほしいからエラーのヒントだけ
>hout=Hash.new
>#hout[ary[i]] = hin
>hout[ary[i]][key] += value
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
277 :
203 :2009/08/19(水) 12:32:53
>>276 hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
>>277 >hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ
で、このときのxはなんだとおもう?
279 :
203 :2009/08/19(水) 12:50:17
>>278 xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
なんどめだナウシカ ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて 「オブジェクト h の [] メソッドに引数 key を渡している」 という処理を簡単に表記できるように特別扱いされたものに過ぎない h = {'one' => 1'} p h['one'] #=> 1 p h.[]('one') #=> 1 つまり、h['one']['two'] という表記があったなら、それは h.[]('one').[]('two') というメソッドチェーンを表しているに過ぎない メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、 が nil だと普通に NoMethodError になる そんだけ
281 :
203 :2009/08/19(水) 12:58:33
あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね
うぜえからダウンローダー使うなってページ構造に書いてあるな まあ知識がないなら手作業でやりゃいいんじゃねえの
JavaScriptのリンククリックするだけのように見えるから JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする 内容が内容だけにこれ以上は自力でやれとしか
285 :
203 :2009/08/19(水) 14:03:15
>>280 すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?
>>285 そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな
よし、ではハッシュの初期値を使うのは禁止だ 理由は、全く理解していないから 望ましい処理を自力で一度書け どういう時にどうなっていて欲しいかを if で条件分岐しろ
なんかみんなを混乱させているようだね。
>>275 >at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
これを説明すると、まずat.rbの12行目でエラーが起きている。
エラーの内容は、nilに対して '[]' というメソッドを実行しようとしているため。
つまり nil[i] のようなことをしている。
at.rbの12行目がなにかわからないけど、hout[ary[i]][key] だとしたら、
・aryがnilのせいで ary[i] がエラー
・houtがnilのせいで hout[ary[i]] がエラー
・hout[ary[i]]がnilのせいで hout[ary[i][key] がエラー
のどれかが原因。
あとは自分で調べて。
289 :
231 :2009/08/19(水) 14:52:04
290 :
チンパンジー愛ちゃん :2009/08/19(水) 15:17:23
初心者が混乱しているときは大抵教え方が悪いと思っていたけどやっぱりそうだった。
ごめん、答えだけ書くね。大体
>>220 と同じ出力になるよ。"w5" => {...}だけ違うけど。
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
if hout[ary[i]].nil?
hout[ary[i]] = hin
else
hin.each do |key, value|
hout[ary[i]][key] += value
end
end
}
pp hout
的確なレスもできないくせにコテうぜえ
>>292 本物はRubyのバージョン的に動かないって書いてあったので・・。
動かしてみた感じでは本物は受け答えできず。
改変版は数行実行したのちエラー。
ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。
本物より動きそうなんですがね。。
厳しい言い方だが、 あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ どっちか
295 :
203 :2009/08/19(水) 15:58:50
>>286-
>>288 ,
>>290 ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。
296 :
チンパンジー愛ちゃん :2009/08/19(水) 16:15:54
mecab坊やはどうなったの?解決したの?
的確なレスもできないくせにコテうぜえ
298 :
デフォルトの名無しさん :2009/08/19(水) 16:48:22
ここまで全部読み飛ばした。 寝る。
とりあえず みんな おつかれ
>>293 Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め
1.8w
>>290 >初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから
>>1 に追加してほしいくらいだ。
本人が言うから名言なんであって もし質問者側からそんなこと言われたらたまったもんじゃないな
304 :
チンパンジー愛ちゃん :2009/08/19(水) 21:29:48
教える側は常に心の奥底で思っていないといけないことですよ。 独りよがりの教えほど迷惑なものはありませんから。
305 :
191 :2009/08/19(水) 22:21:17
すまん、俺が変な野郎(
>>192 )を呼び込んでしまったようだ orz...
あとは俺に任せてくれ。
どっちもサルに見えるのだが
逆引きRuby誰か書き足してくれ
とりあえず、逆引きRubyという話題を振る時は、 どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?
日本語でおk
レシピブック初版にはお世話になったけど
最近いろいろあるから次買うとき迷うな
>>309 書き足すっていうぐらいだからWikiのほうだろう
Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど これって困ってる人いないのかな
>>304 そこまで自覚があるなら、さっさと消えろよ
>>312 あー,それ確か俺も愕然とした記憶が。
「=begin, =end は使わないことにする」で解決!
シリアルポートからデータをgetsで読んでます。 データは一行ずつ出力されるので問題は生じません。 しかし、特殊な設定情報だけは複数行出力で、行数が不定です。 このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?
行とい考え方を無くせばいい ただの改行文字だろ
設定情報用の一時変数を確保しておいて、 設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?
318 :
315 :2009/08/21(金) 11:26:15
ありがとうございます。 とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。 EOFがないので終了条件をどうするか悩んでみます。
>>318 EOFって全体の?
終了データが流れてこないとかpingみたいな定期送信がないなら
手動停止させるのが普通だと思う
可変長データなのにサイズ情報も終端情報もないのだとしたら
次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか
そりゃデータフォーマットがわからにゃなんとも
321 :
315 :2009/08/21(金) 11:58:57
>>319 全てのデータを受信できるまで、timeoutモジュールを使って少し待ってからgetsの待ちを解除してみます。
自作のスクリプトがあります libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました んで、これを日常で使いたいと思います 「開発ディレクトリ」と「実行ディレクトリ」を分けなければなりません (動作しない状態であることが多い開発中のスクリプトをcronなどで触らせたくない) どこか適当なディレクトリに「インストール」してバージョンを維持するのがいいと思ってます 最初は rubygem パッケージにすることを考えましたが、 require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません (たぶん、スクリプト本体の実行時間のほうが短い) これ以外になにかてきとーな方法はありませんか?
>>322 rake install で超適当なディレクトリに超適当に上書きするような rake スクリプトを書く
要は実行可能なときにファイルをコピーしておきたいってことだろ
ファイルをコピーするという行為だけ rake で書け
バージョン戻すという行為が簡単にできないのだけが難点だが、
まあ実行用ディレクトリを適当に圧縮でもしてバックアップしとけ
質問です。 ary = [5, 2, 3, 3, 3, 4, 2, 2] のような配列を [5, 2, 3, 4, 2] のようにする、つまり、「隣り合った」同値の要素を uniqにまとめた配列を得る方法を求めています。 ary = [5, 2, 3, 3, 3, 4, 2, 2] prev = nil result = [] ary.each do |n| result << n if prev != n prev = n end result #=> [5, 2, 3, 4, 2] とするより、良い方法はないものでしょうか? これに限らず、配列処理で直前(または 直後)の要素を参照しながら 進めていくスマートな方法があれば教えていただきたいのですが・・・。
prev = nil result = ary.select{|v| v == prev ? false : (prev = v) }
前後を参照するほうが注目だったか、スマン出直してくる
Enumerable#each_cons
>>326 selectをこういうふうに使えるのは知りませんでした。
関数型言語みたいで格好いいなあ。
>>328 こういうのを探していました。ありがとうございます。
デバッガ使ってる? 使いこなせてないからかもしれないけども,まだ自分にはpとかppで十分かな. どんなレベルからデバッガつかってんの?
みんななにで開発してるんだろう? IDE?エディタ+コンソール?
>>331 エディタ+コンソール派
軽くて良いIDEがあったら、そっちに乗り換えるつもり
333 :
デフォルトの名無しさん :2009/08/21(金) 23:22:01
デバッガ使ってもバグ直ってないニダ。 謝罪と賠償ニダ。
RDEがもっと使いやすかったらいいのにな・・・
netbeansで書いて、家ではemacs+putty
EclispeからNetbeansに行ってemacsかな。日曜PGなんで結局自分が良く使うエディタがいいや。
Aptana+Eclispe はじめたばっかりですけど
ソースコード上でデバッグできるのは? NetBeansがいいんかな?
正直どれもイマイチ 言語仕様的問題だとは思うんだが
340 :
デフォルトの名無しさん :2009/08/22(土) 09:44:00
>325 result = ary.zip([nil]+ary).select{|x,y| x!=y}.map(&:first)
>>340 each_consが提示された時点で問題外
オナニー以下
色んなやり方が紹介されるのは,初心者スレでは意味があるんじゃないかな。
悪例だったらダメだけど,
>>340 は「へーこういうのもあるんだ」的な
例にもなってると思うし。
data = ハッシュまたは適当な格納系クラス Target.new(param).hoge(data) data #<= Target に関する情報が追加されている という処理をします hoge というメソッドにわかりやすい名前を付けたいのですが、なんかいい案ありませんか 凝ってもアレだし update とか register でいいですかね
ようそが nil いっこだけのはいれつがかいてあるじてんでかっこわるくてあたまぐるんぐるんぐるんします
>>343 Hoge#dup_to(data) とか
updateならHashにならってHoge#update(Target)にすべき
後は
hoge = Target.new(param).to_hoge
とか
hoge = Hoge.new(Target.new(param))
>>343 「自分の内容で引数のデータオブジェクト(自分とは別構成)を更新する」というメソッドに
update は似合わない
Ruby の update は自分と引数が同類であるべき
引数に現在のインスタンス変数の内容を適宜コピー、というメソッドは…なんだろうね
動作としてはこんなんだろ
h = Hash.new
Foo.hoge(h)
Bar.hoge(h)
Baz.hoge(h)
p h
で、h が {'foo' => …, 'bar' => …, 'baz' => …} になったり
{111 => {:foo => …, :bar=> …, :baz => …}, 222 => {:foo => …, :bar=> …, :baz => …}, ...} になるって奴
348 :
346 :2009/08/22(土) 17:09:40
間違えた ×Hoge#dup_to(data) ○Target#dup_to_(data) dup_to(data)じゃなくてdup(type=nil)にして typeがクラスならデータ格納したインスタンスを生成、 インスタンスならそれに情報をコピー、nilならsuperとかどうだろう
きめえ ObjectやModuleの基本メソッドは上書きすんな
dupの存在を知らないだけかもしれないじゃないか irb> a = [] irb> b = a.dup irb> a << 1 irb> p b []
>>349 > ObjectやModuleの基本メソッドは上書きすんな
なんで?
inspectとか==とかto_*とか普通上書きするだろ、最たるものはinitialize
それにdupに引数与えなければ以前と同じ動作をするんだから互換性も問題無い
>>343 自分なら Target.new(param).hoge は Hash あたりを吐き出すようにして
data側が自分で取り込むようにする
たとえばdata = {} なら data.update( Target.new(param).hoge )
だから名前は、ある種のアクセサとして吐き出すデータに見合った名前か
主要なデータをまるっと吐くなら to_h とか
>>351 機能はそのままに、そのオブジェクトに見合うよう上書きするのと
機能自体を拡張するという違いがあるからなぁ
ダメだと思わないけど積極的にやるのも微妙な感じ
Ruby Best Practicesは良い本ですか?
354 :
デフォルトの名無しさん :2009/08/22(土) 20:24:17
Ruby Best Practicesは(どうでも)良い本です。
初歩的な質問ですいません。 Linuxで、シェル(bash cshなど)よりrubyの方が優れているところは何でしょうか?
>>355 シェルスクリプトでめんどくさい処理も簡潔に書ける
めんどくさいと思った経験が無いならシェルスクリプト使っとけ
>>356 すいません、シェルは結構使うんですが、Rubyは勉強しだしたばっかりであまりよくわかってないんです。
なので自分で比較ができないんですが、具体的にはどんなところがRuby優位なのでしょうか?
例えば指定したディレクトリとそのサブディレクトリを巡回して ファイルのサイズを集計してどのフォルダが何%消費しているかを 大きい順にソートして上位50個表示。 なんてユーティリティを書くと差が出てくるかな。
>>357 アプリ一つ書いてみればわかるんじゃないだろうか。
WEBアプリなら敷居が低いから、とりあえず掲示板でも。
また例えば、CSVのパースとかしたくなったときに、シェルスクリプトで
どうやったらいいのかちょっとすぐには思いつかない。
シェルスクリプトってものがどういうものかっていう知識不足 だからどんなレスしても、理解できない
361 :
355 :2009/08/22(土) 21:14:54
シェルでもcpとかrmしかつかってないんで、 難しいことわかりません。 理解できませんので失礼します。
>>358 du -h | sort で用が足りそうな気もするな
CSV処理やらディレクトリ走査はシェルスクリプトの得意分野じゃねえの。 シェルスクリプトを覚える必要がないならrubyで良いと思うけども。
多次元配列の重複要素削除の仕方がわかりません Cでいうところの、 a[3][5] = {[1,2,3,4,a], [2,3,4,5,b], [2,3,4,5,a]} って、あったら、aが重複してるので、 [1,2,3,4,a], [2,3,4,5,b] だけにしたい a.uniq{|x| x[4]} ってのは間違い??
>>364 Array#uniqはブロックを取らないはず
a[x][4]の値が既出の配列は捨てるってことだよね?
a = [[1,2,3,4,"a"], [2,3,4,5,"b"], [2,3,4,5,"a"]]
tmp = {}
a.select{|v| tmp[v[4]] ? false : (tmp[v[4]] = true) }
どこかで見たと思ったら
>>326 と似てた
>>364 多次元配列など存在しません
ネストした配列とお呼び下さい
で、まあ、ネストしただけの配列なので普通にイテレーションして
exists = Array.new
a.delete_if{|arr| if exists.include?(arr[4]) then false else exists << arr[4]; true end}
とかすればいいんじゃね
Rubyでコレクションをぐるぐるすること厭っちゃダメ
【レス抽出】 対象スレ:Ruby 初心者スレッド Part 30 キーワード:select 抽出レス数:11 これ全部同じ奴なんだろうな、とか思う
select が条件全体抽出なのは混乱する、という人は少なくなさそうだな collect select reject detect inject と map find_all reject find inject なら後者のほうがまだマシにも思えるが、あ〜、でもどうだろう このへんは出身言語にもよるんだろうけどさ find/map 派と detect/collect 派は結構昔から揉めてる気がする find と find_all が紛らわしいとか、そんなんセレクトとデテクトのほうが紛らわしいわボケとか あと、古い ActiveRecord は find_all が上書きされるから新しいの入れて ActiveRecord#all で書け
>>364 > a.uniq{|x| x[4]}
> ってのは間違い??
1.9 ならそれで動くよ。
1.8はそろそろ分離してスレ立ててほしいな 【まだまだ】Ruby1.8.x 初心者スレ【現役】 とか
>>370 1年半で200レスしか行かないトピックスを1ヶ月で1000レス消費するスレから分離要求とか片腹痛いわー
そういうのは1.9スレ繁盛させてから言え
時代についていけない老害め
え、板を利用させてもらってる分際で何言ってんの 既存スレの利用もできないのに新スレとか何様
いまだに1.8.xにしがみつくのはRuby界の足をひっぱってるってことに気がつけ
夏の思い出作りなんだろ 自分の提案であの2ちゃんねるにスレが立つんだぜ 俺なら射精するね
2chが世界の全てな人には何を言っても無駄 2chのスレ立てとRuby界の関係とかもうわけわからんし
>>374 One-Click Installerの1.9版すら出てないのに何を言ってるの
夏の思い出うんぬんって流行ってるのか? 前にも薬が切れたみたいなやつが言ってた気がするが
お前ら隔離スレに帰ってくれ
バージョンの指定をするスレの方がレスが少ないのは当然だろ
382 :
デフォルトの名無しさん :2009/08/23(日) 22:29:36
Rubyでopensslを利用して共通鍵暗号を使う場合、以下のような
コードを書きますが、pkcs5_keyivgenを使うのはセキュリティ上
良くないのですか?
require 'openssl'
a123 = "0123456789"
pass = "hogehoge"
enc = OpenSSL::Cipher::DES.new
enc.encrypt
enc.pkcs5_keyivgen(pass) # <= この記述がよろしくない?
a = enc.update(a123)
b = enc.final
s = a + b
こんなページ↓を見つけたので、気になりました。
ttp://wp.serpere.info/archives/422 Rubyのソースコード(ossl_cipher.c)には、以下の記載がありますが、
詳しい意味が分かりません。
* WARNING: This method is only PKCS5 v1.5 compliant when using RC2, RC4-40, or DES
* with MD5 or SHA1. Using anything else (like AES) will generate the key/iv using an
* OpenSSL specific method. Use a PKCS5 v2 key generation method instead.
ソースコードの注釈の意味と、pkcs5_keyivgenを使わずに適切に
記述する方法を教えてください。
>>382 初心者スレの内容を超えているようにおもうけど、頑張ってみよう。
コメントを翻訳すると、こんな感じでしょうか。暗号についての知識がないのでよくわからないけど。
警告: このメソッドは、RC2やRC4-40を使う場合、あるいはDESをMD5やSHA1とともに使う場合には、PKCS5 v1.5 のみに準拠しています。
他のもの(AESとか)を使うと、OpenSSL固有のメソッドを使ってkey/ivを生成します。
かわりにPKCS5 v2 キー生成メソッドを使ってください。
・・・うん、やっぱわからん。メーリングリストで聞いてみることをお勧めします。
irb> puts "あいう".unpack("U*").map{|e| sprintf("\\u%x", e)}.join \u3042\u3044\u3046 正直、ユニバーサルキャラクタ名に一発で変換できないのは怒っていいと思う
1.8にはない。 [ 0x3042 ].pack('U') #=> "あ" 1.9では "¥u3042" #=> "あ"
inspect の返り値をそのまま "" で貼ると、 ファイル自体の文字コードによらずにUTF-8文字列になる ただし 1.8 系列限定 irb> puts "あいう".toutf8.inspect "\343\201\202\343\201\204\343\201\206" ruby -Ke require 'nkf' p NKF.guess("あいう") == NKF::EUC #=> true p NKF.guess("\343\201\202\343\201\204\343\201\206") == NKF::UTF8 #=> true
url 文字列を new に渡すとなんか便利な追加データを搭載した MyURL オブジェクトが返るクラスがあります MyURL.new(url) この url が MyURL クラスのオブジェクトだった場合、何もせずにその url 自体を返して欲しいです
>>388 Ruby ではそーゆー芸はできません
initialize 内で self を置き換えることができません
class MyURL
def initialize(url)
…
end
def self.build(url)
if url.kind_of?(MyURL) then
return url
else
self.class.new(url)
end
end
end
my = MyURL.build(url)
とか運用で回避します
newを再定義すればいいんじゃないの?
def self.new(url) return url if url.is_a?(MyURL) myurl = allocate myurl.instance_eval { initialize(url) } myurl end is_a? の部分は respond_to? MyURL固有のメソッド とかの方がいいかも
392 :
203 :2009/08/24(月) 20:16:26
また,質問です.行列のようになった方がみやすいと思って
>>222 さんのものをつかって
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w (w1 w2 w3)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
end
pp hout
このようにしました.
そして,colを行列の項目のようにして
{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0}}
という出力が欲しいのですが,どのように書き換えればいいか分かりません.
前回の1つ1つは理解できたと思っていましたができませんでした・・・・.すいません.
だから処理を逐次書けとあれほど わからないうちからまとめたって変更できないんだから
>>392 メソッドチェーンとか駆使しないでもっと愚直にやれば?
それこそ1行1行 p で結果を確認しながら積み上げていく感じでさ
396 :
デフォルトの名無しさん :2009/08/24(月) 22:25:35
>>392 を実行すると
{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5, "w4"=>2, "w5"=>1},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0, "w4"=>3, "w5"=>2},
"w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w4"=>0, "w5"=>1},
"w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1, "w5"=>0}}
ってなるんだけど、これが欲しい出力なんじゃないの?
違うんなら、質問をもっとわかりやすく書いて。
397 :
デフォルトの名無しさん :2009/08/24(月) 22:26:50
ruby -vとやったときの出力を以下のように貼ってね。 ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
398 :
デフォルトの名無しさん :2009/08/24(月) 22:31:47
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
399 :
デフォルトの名無しさん :2009/08/24(月) 22:34:08
1.8 wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwww
400 :
203 :2009/08/24(月) 23:08:44
>>396 >>392 の実行結果ではなくて
{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0}}
となってほしいです。
col = %w(w1 w2 w3) がcol = %w(w7 w8 w9)だったら
{"w7"=>{"w7"=>0, "w8"=>0, "w9"=>0},
"w8"=>{"w7"=>0, "w8"=>0, "w9"=>0},
"w9"=>{"w7"=>0, "w8"=>0, "w9"=>0}} となって欲しいです。
colの中身の配列がaryの中にあるかをwindowでずらしながら確認するのです。
とりあえずバージョンは
ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]です。
>>400 "w?"=>0 以外の結果は
>>222 のhoutに入ってるんだから
そこからcolに一致するデータだけ抜き出せばいいじゃん
402 :
203 :2009/08/25(火) 01:46:21
>>401 思いつく限りしてみたのですが・・・
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w(w1 w2 w3 w9)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] += 1 }
end
pp hout
ar=Hash.new;ar.default=0;ar= hout.values[0].values_at(*col)
p ar
hout.each_pair do |k,v|
if col.include?(k)
puts "#{k}\t#{v.values_at(*col)}"
end
end
# >> {"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
# >> "w2"=>{"w1"=>4, "w2"=>0, "w3"=>5, "w4"=>2, "w5"=>1},
# >> "w3"=>{"w1"=>4, "w2"=>2, "w3"=>0, "w4"=>3, "w5"=>2},
# >> "w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w4"=>0, "w5"=>1},
# >> "w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1, "w5"=>0}}
# >> ["w1", "w2"]
# >> [0, 4, 4, nil]
# >> w1 044
# >> w2 405
# >> w3 420
arにkeyが存在しなければnilではなくて0にしたいのですが何かどうすればいいでしょうか?
>>402 のコードの方向性は間違ってない
特殊な用件にスマートな解答なんてそうそう無いよ
ないなら自分で作るしか無いんだよ
この行が何やってるか理解すればnilを0にする(?)方法もわかるかも
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
>>391 > myurl = allocate
> myurl.instance_eval { initialize(url) }
> myurl
の部分はsuperだけでいい
405 :
203 :2009/08/25(火) 04:17:16
>>403 injectが自分にはまだ早いのでeachでやってみました。
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w(w1 w2 w3 w9)
non = col - ary
〜〜
zero =Hash.new;ary.uniq.each { |v| zero[v]=0}
czero =Hash.new ;col.uniq.each { |v| czero[v]=0}
p zero;p czero
p zero.merge!(czero)
〜〜
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] += 1 }
end
non.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] =0 }
end
pp hout
かなりお行儀が悪いですが、自分の欲しいものができそうなのでこれから加工してみます。
ありがとうございました。
・・・・また、来るかもしれませんが。そのときは、よろしくお願いしますm(_ _)m
406 :
デフォルトの名無しさん :2009/08/25(火) 08:33:15
メソッドに与えられたブロックは、仮引数の最後に & を付けると 手続きオブジェクトとして得られるらしいけど、 def foo(&block) ... end このとき「if block_given?」と「if block」は等価なの? 前者の式の方をよく目にするけど、どう違うの??
def で定義してるぶんにはなんも変わらんので素直に block_given? 使っとけ
408 :
名無し学生 :2009/08/25(火) 10:35:40
Visual Basic の課題で困っております。 誰かお答えください。本当に助けてください。 1.Visual Basicの関数で数値を文字に直すCStr()とStr()の違いについて 2.戻り値の違いが確認できる方法を考え、戻り値の違いについて実際に確認し、 その確認方法と違いを具体的に述べよ。 注意:実際にやったことと、確認した違いを簡潔かつ具体的に書くこと。 3.下記の計算結果などから、Visual Basicで計算できる数値の桁数について考察をまとめ、 何故そのような制限があるかについて理由を答えよ 1) 48 x 100 - 81 2) 12 ÷ 9.3 x 247 3) 0.2 - 12 ÷ 69 4) -12 ÷ 100 + 100
VBなら「自分が興味のあるソフトを作りなさい」くらいの課題を出せよ どこの学校だ?
410 :
デフォルトの名無しさん :2009/08/25(火) 10:44:04
そのような曖昧なテーマの課題を出す学校もどうかと思うが。
> これってRuby勉強の手助けになりますか? いや特には > それはさておき、読んで損のない本でしょうか? お金の余ってる人向け お金が余ってるなら読んでもよい お金が余ってないならもっと他に読む本があるはず
>>413 そうですか。
今回はパスしておきます。
どんだけ金ないんだよ
416 :
デフォルトの名無しさん :2009/08/25(火) 14:09:29
ここは学生スレ
s = Path::changeext($0, ".cfg") t = Path.new(s) t.changeext(".xml") #==> Path::changeext(s, ".xml") みたいな使い方をしたいんですけど クラスメソッドとインスタンスメソッドのoverloadなんて無理? # Pathはただの例です
インスタンスメソッドの中でクラスメソッドを呼ぶとかそういう話ではなく? class Path def change_ext(sfx) return self.class.change_ext(@str, sfx) end def self.change_ext(str, sfx) … end end
>>417 Path::changeext() と t.changeext() はそれぞれ別のメソッドが呼ばれます。
なおその例で「overload」というのは誤解を招くので使わない方がいいです。
質問するなら、
「クラスメソッドとインスタンスメソッドで同じメソッド名を使うことってできる?」
ぐらいにしておけば、overloadという単語を使わなくても済んだでしょう。
てか、クラスメソッドの起動で :: を使う人は Ruby ではまずいない Ruby では :: の右に来るのは定数で、 . の右に来るのはメソッドだから Ruby ではクラスも定数として格納されてるから、 irb> CONST = 1 irb> CONST = 2 (irb)2: warning: already initialized constant CONST irb> class Foo; end irb> Foo = 2 (irb):4: warning: already initialized constant Foo ネストしたクラスは Foo::Bar::Baz と :: で連結するし、 あるクラス Hoge の定数 CONST は :: で連結して Hoge::CONST と綴る Ruby ではインスタンスメソッドは一般クラスから作られたオブジェクトに属するメソッドだから、 特定のクラスのオブジェクトというかインスタンス s に属するインスタンスメソッド mes は 特定のクラスのインスタンス s に . でメソッドを繋げて s.mes と書くし、 Ruby では スクリプト中に存在するアクセス可能なクラスは Class(または Module)クラスのインスタンスだから、 irb> p "str".class String irb> p String.class Class クラス S に属するメソッドつまりクラスメソッド moge は Class クラスのインスタンス S に . でメソッドを繋げて S.moge と表現する
ちょっとはじめたばっかりでしつもんなんですけど Array.newと[]やHash.newと{}のどっちがいいとかありますか? 始めたばっかりでくせをつけておくなら今のうちかなとおもいましたので こうやるやるべきとかのってるページとかありますか?
機能的には同じなので好きなほう使え [] や {} のリテラル形式は短い 短いということはそれだけで大きな価値がある ただし hoge#[] メソッド や ブロック {} と一瞬区別がつけにくいことがありうる 一瞬でも読み下しに詰まる可能性があるということはそれだけでマイナスだ 好きなほう使え
おいおい同じじゃないだろ Hash.new、Array.newはデフォルト値やサイズを設定することができる オレ的には[]{}を基本に使って、 デフォルト値やサイズを指定したい場合はnewを使うのがおすすめかな
そんなこと言ったらリテラルな時点で別物だ そういう区別をして欲しいわけではないだろう
機能的な違いのあるなしと一緒にするな
別に {} でもデフォルト値は設定できるよ h = {} h.default = 0 p h[:a] #=> 0 マニュアルに書いてあるようなことを知りたいんじゃないと思われ
h.default←別のメソッド引っ張り出してきてどうする 質問者の潜在的なニーズがなんであれ間違いを教えるのはよくない 両者は「同じ」と書いてあったから「違いがある」と訂正しただけ それ以上の意味はない
RubyではHTMLのエスケープってどこでやるべき?
データ出力時 ただしこれには条件がある 「データ出力者全員が自力でエスケープをしなければならないと認識していること」 これが未来に守られる見込みが全くないのなら、 現在のデータ保管者が親代わりにエスケープするのも致し方ない
入力時でないことは確か
>>420 おまえの文章長いよ
もっと要点を絞って簡潔に書こうぜ
>>420 を蒸し返すと、
a.some_method(1, "str")
a::some_method(1, "str")
上の2つのスタイルのうち、いずれを使うかは趣味の問題です。
ただしクラスメソッドを呼ぶ場合を除いては第1のスタイルが主流です。
筆者はクラスメソッドに対しても一貫して第1のスタイルを用います。
- 初めてのRubyより -
わざわざリリースマネージャが「〜を除いては」と書くくらいだから、
「まずいない」ということはないだろう。
実際の観測として「まずいない」と思うが…
そんな大量にコード見てるわけじゃないが、:: でメソッド呼んだ人は今年一度も見てないぞ
>>417 が初めてな気がする
大文字で始まるメソッドは、括弧を省略すると::で呼び出せない。 そういう細かい条件を考えると、メソッド呼び出しは.で統一するのが無難。
436 :
デフォルトの名無しさん :2009/08/26(水) 18:45:58
すいませんが、質問させて頂きます。 xmpfilterを使いたいのですが、どうも上手く行きません。 OSはWindowsVista , ruby1.8.6です。 gem install rcodetools でインストールした後 -------------test.rb-- #! ruby -Ks p 2+3 # => -------------------- 上記のファイルに対して xmpfilter test.rb を実行すると -e:1: unterminated string meets end of file -e:1: warning: useless use of a literal in void context というエラーが出て、実行してくれません。 空のファイルに対しても、どれも同じエラーが出ます。 どうすれば良いかを教えて下さい。
2+3 の後ろに全角空白が入ってるんだけどこれは意図したものかな
438 :
436 :2009/08/26(水) 19:24:51
>>437 すいません。全角空白は私の不注意でした。
しかし、これを削っても同じエラーが出てしまいます。
ちなみに、xmpfilterを通さなければtest.rbはきちんと実行することが出来ます。
自動生成された \bin\xmpfilter がまずいような気もする もしかして cygwin か?
440 :
436 :2009/08/26(水) 19:51:21
>>439 いえ、cygwinではなくコマンドプロンプトです。
rcodetoolsが自動生成するファイルがどこにあるのか分からないのですが、
どこに作成するのか教えて頂けないでしょうか?
>>440 gem contents GEM名
あとバージョンはruby -v結果のコピペで
それとたぶんOneClickInstallerだと思うんだけどそれも明記するとありがたい
442 :
デフォルトの名無しさん :2009/08/26(水) 21:03:14
ルビーでGUIは作れるのでしょうか?
445 :
436 :2009/08/27(木) 00:08:38
すいません、多分解決したみたいです。 ruby 1.8.7 , ruby1.9.1 とverを上げてxmpfilterを実行してみたところ無事に実行出来ました。 お騒がせして申し訳ありませんでした。 返信をして下さった方、どうもありがとうございました。
データを突っ込んで行ってそれがあるかないかを高速に判断する場合 ハッシュがベストですか? list["a"] = true if list["a"] then ... で動くんですけどtrueってデータもペアで格納されるのがなんとなく無駄な飢餓
とりあえず Hash 使えということになってる Hash で問題がある場合にのみ他のめんどくさい手段を検討する あと true はいつどこで呼んでもオブジェクト ID が 2 で固定なので無駄も何もねえよ
Hashでいいと思う 標準添付のSet(集合)なんてHashで実装されてるし。
こっち↓と if point > 0 result['WIN'] += 1 elsif point < 0 result['LOSE]' += 1 else result['DRAW'] += 1 end こっち↓ win_or_lose = point > 0 ? 'WIN' \ : point < 0 ? 'LOSE' \ : 'DRAW' result[win_or_lose] += 1 どちらがいいと思いますか?
三項演算子は好きこのんで使うものじゃないね result = if flag then true else false end どうしても一行で書きたい時にこれよりはマシって程度
>>449 case
when point > 0 then result['WIN'] += 1
when point == 0 then result['DRAW'] += 1
when point < 0 then result['LOSE'] += 1
end
前どっかで書いたが、条件演算子は便利なんだからどんどん使ってよい そして、どんどん書き換えろ 条件演算子の中で整頓改行したり ( ) でネストしたり ; つけたりするのは禁止 条件演算子の状態に固執するのはただのアホ 条件演算子の 9 割は最終的には長い条件分岐に書き換えられてしまう だったらプロトタイプは早くてうまくてやっすいのにしたほうがいいってもんだ
Rubyの三項演算子の平均寿命は1日だそうな
Rubyの場合ifが式だからifで書けばいいと思うんだけど。 可読性もそのほうが高いと思わない?
if のほうがわかりやすそうな気がするときと、 条件演算子のほうがわかりやすそうな気がするときの 2つがあるような気がする 極めて単純な見栄えの問題 他の言語では三項演算子だけが値を返すから入れ替えが効かないけど Rubyは動作自体は結局一緒だから (パースの受け方は違うかもしれない)
case文の意味なくないか?w
空 case の例としてはわりと妥当だと思う else raise の余地がないのがやや弱いがわかりやすかろう
このへんは cond をかっちょええと思うかわかりにくくなったと思うかという話になるような気がしないでもない
result[ case when point > 0 then 'WIN' when point == 0 then 'DRAW' when point < 0 then 'LOSE' end ] += 1 だろJK
>>460 その空case自体に疑問
条件に重複する部分がないのを暗示してる、みたいなニュアンス?
コードゴルファー登場↓
わいは猿や!
result[point / 0.0] += 1
467 :
466 :2009/08/28(金) 16:25:20
point = 0 のときダメだった。スマン
result[{1=>'WIN',0=>'DRAW',-1=>'LOSE'}[point<=>0]]+=1
result[%w[DRAW WIN LOSE][point<=>0]]+=1
配列で要素が重複していたときに重複している要素の値が知りたいのですが 簡単な方法はないでしょうか? [1,2,3,4,5,6,3]であれば3が知りたいです 重複は1種類が1回だけしていると仮定してかまいません
ありそうでないんだよね、そういう機能 重複は全部消去するのが基本 「配列の構成要素を uniq で決定し、それと同じ値を持つ最初の場所を探してその要素を配列から消す」 という手順でやるとこうなる arr = [1, 2, 3, 4, 5, 6, 3] arr.uniq.each{|e| arr.delete_at(arr.index(e))} p arr [3] これだと arr が失われてしまうので他の人の案待つか事前に複製でもしとけ
a1 = ary.sort a2 = a1.uniq i = 0 a1.find_all {|v| if v.eql? a2[i] i += 1 false else true end } またselectかと言われそうだけどこのスレでは三回目
h = {} p aryfind {|a| h[a] || !(h[a] = true)}
474 :
デフォルトの名無しさん :2009/08/28(金) 19:30:14
ary.find
>>470 arr = [1,2,3,4,5,6,3]
hash = {}
hash.default = 0
arr.each {|x| hash[x] += 1 }
p hash.keys.select {|k| hash[k] > 1 }
476 :
470 :2009/08/28(金) 21:24:24
みなさん色々な案ありがとうございます 参考にさせてもらいます!
One Click InstallerだかをWindowsで入れると、 RUBYOPT=-rubygems だかを環境変数に設定するというような余計な(親切な)ことをしてくれるわけですが、 これって、 require "rubygems" する必要がなくなるわけですよね? 他の環境などで同じようなこと(RUBYOPT=-rubygems) している人っていますか? やっぱり、require "rubygems"をソース内に書いた方がいいものですかね?
require "rubygems" は必ず書かなければならない 俺が RUBYOPT を嫌いな理由の一つ わざわざ可搬性下げて何をしたいのか
あとから広まって事実上の標準になる予定だったんだよ
別に RUBYOPT は rubygems 用の機能じゃねえが、1.9 で組み込みになったから RUBYOPT=-rubygems に関してはもう無用の長物だな
481 :
デフォルトの名無しさん :2009/08/29(土) 10:20:24
>>470 ary.group_by{|e|e}.to_a.select{|e|e[1].size>1}.map(&:first)
とか
ary.sort.each_cons(2).select{|x,y|x==y}.map(&:first).uniq
とか
>>481 selectするならto_aはいらん
と思ったが、multiple values for a block parameter (2 for 1)とい
う警告が何度も出るのか
ary.group_by{|e|e}.select{|e,l|l.size>1}.map(&:first)
>>478 > 俺が RUBYOPT を嫌いな理由の一つ
「江戸の仇を長崎で討つ」ってやつか
そもそもrubygemsが嫌い
485 :
sage :2009/08/30(日) 00:10:43
同一のテーブル構造をもつデータベースAとBがあって、 データベースの内容を比較したいです。 どちらのデータベースもSQLiteのファイルです。 ActiveRecordというのを使うのが簡単そうなのですが、 可能なのでしょうか? というのは調べてみるとActiveRecordでは、 データベースへの接続(ActiveRecord::Base.establish_connection)とか、 レコードの検索を、クラスメソッドで操作しています。 となると、上記のように同一クラスから 別々のデータベースへ接続するインスタンスを作成して、 インスタンス経由で操作するという使い方はできないように見えます。
>>485 SQLite3::Database.new(file)で両方のデータベース開いて
テーブル毎にレコードの比較した方が楽な気がする
487 :
sage :2009/08/30(日) 01:38:36
>>486 回答ありがとうございます。
SQL書かずにActiveRecordでできたら楽勝!
と思っていたのでなんとかならないかなーと。
488 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 07:42:50
初めまして。 質問です。 今やってるプロジェクトが、以前、rubyのMVCフレームワークによって書かれました。 その開発した方が、/public_html/.htaccessで何らかの設定をしました。 今回、/public_html/manage/配下にphpのMVCフレームワークを使用して開発することに なったのですが、/manage/.htaccessで設定しても親ディレクトリの.htaccessの影響を受けて /manage/配下のファイルにアクセスしても、404になってしまいます。 /public_html/.htaccessの内容も分からず、なるだけ触りたくないのですが、 サブディレクトリの.htaccessで、親ディレクトリの.htaccessの影響を全く受けないようにすることは可能でしょうか。 お忙しいところ、すみません。 よろしくお願いします。
Ruby 関係ねえ .htaccess の書式勉強しろ
Ruby関係ないからスレチ > .htaccessの内容も分からず、なるだけ触りたくないのですが、 それを晒さないと。というより、せめて自分で読んでみないと。
491 :
488 :2009/08/30(日) 10:00:38
可能
/public_html/.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule manage\/$ manage/app/webroot/ [L] RewriteRule manage\/(.*) manage/app/webroot/$1 [L] </IfModule>
てか Ruby 全く関係ねーということがわかってなお居座るのってなんなの頭悪いの
>>494 自分で正しいことをしていると思っているイタイタイプ
周りでは陰で嫌われているのに気づかないタイプ
自分の目的が果たされれば何をしても構わないと思ってるタイプ
497 :
sage :2009/08/30(日) 12:54:11
ソウダネ、IDナイカラ、ダレガダレダカサッパリワカラナイネ。
>>491 すげーなー。
そのhtaccessファイルの中身の何がおかしいのかもわからない・調べられないのに、
Webアプリケーションを開発しようなんて。
恐ろしくて使いたくないぜ。
>>497 テーブルの差異を調べるプログラム位、数十分で書けるだろ
二度と使わないかもしれないORMの調査に無駄な時間を費すの?
dbs = [file1,file2].map {|fn| SQLite3::Database.new(fn) }
dbs[0].tables.each do |table| # tablesなんてメソッドがあるとして
results = dbs.map {|db| db.execute("select * from #{table}") }
# results を比較
:
end
502 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 16:37:20
SQLを書きたくないんじゃなくて 書けないの間違いだろうな。。
クエリに文字列埋め込みステキです
何を言ってるの ユーザーがSQLを直接発行するだなんて悪手中の悪手じゃないか 適当にうまくやるよボタンを押すだけで内部でSQLが組み立てられて 結果のデータのみがユーザーに返ってくるというのが正しいありかただろう
>>504 そうなんだよねえ
結局SQLを書かせなければならないことになって深く絶望したわ
なんとかならんもんかね
> SQLite3::Database.new(file)で両方のデータベース開いて > テーブル毎にレコードの比較した方が楽な気がする 答えでてるじゃん。 終了
Ruby使うまでもなくdumpしてdiffとればいいんじゃない。
なんだろう。
>>501 を信じてそのままドンってやって、ガツンと応答不能になり得たりしそうなこの不安感。
初心者スレでこれはありなんだろうか。
>>501 の論旨からいうならもうちょっと、丁寧に逐次的に例を出す文脈ではなかろうか。
509 :
501 :2009/08/30(日) 21:41:49
>>508 俺に遠慮する必要は無い、君が教えてあげてくれ
510 :
sage :2009/08/30(日) 22:44:10
>>485 です。
ActiveRecordではなくてSequelというのが
良さそうというのがわかりました。
Sequel:
http://sequel.rubyforge.org/ こんな感じで書けます。
DBLeft = Sequel.sqlite("./left.sqlite")
left_table_foo = DBLeft[:table_foo]
DBRight = Sequel.sqlite("./right.sqlite")
right_table_foo = DBRight[:table_foo]
left_table_foo.each do |left_rec|
# right_tableのレコードと比較する
end
なんかしつこく質問してしまったみたいですみません。
でも回答してくれて助かりました。では。
511 :
デフォルトの名無しさん :2009/08/31(月) 01:39:52
WinXPで1.8.6です。 文字列を16進ダンプしたものの中に、2バイト文字が含まれているか どうかを判定するにはどうしたら良いでしょうか? 変換コードは下記の通りです。 arr0 = dataStr.unpack("H*")[0].scan(/[0-9a-f]{2}/) arr1= arr0.to_s + "\n" 対象のdataStrが Rec の場合 arr1 が 52,65,63 になりますが、 Rク では 52,83,4e です。この場合、真ん中の16進数の83を元に 判定するのでしょうか?
>>511 文字コード決めないと「2バイト文字」を定義できなくないか?
zenkaku=false arr0.each do |c| if c>128 do zenkaku=true end end
globってなんであんな低機能なまま放置されてんの?
cgiてなんであんな低能なまま放置されてんの?
cgiは酷いね。参考にも成らない。 いい加減、政権交代の様に入れ替えるべき。
cgiに関しては、政権交代!ばかりいってるだけだし民主党よりヒドイw
候補者はいるだろ。その候補者を使えるレベルまでもっていくやつがだれもいないだけで。 WEBrickのcgiライブラリのことなんだけど。
WEBrick::Sessionがないのはある意味象徴的
これは何度でも言うが、作るだけなら立候補は何人もいるしいくつも作品があるんだよ 作るということとメンテナンスを引き受けるということとは全く違う スレ違いだが
>>523 >作るだけなら立候補は何人もいるしいくつも作品があるんだよ
いくつもあるとは知らなかった。
ぜひ紹介してくれ。
ネット関連のライブラリは魔界だ バージョン0.3まで行かずに放置されるのばっかじゃん
Rackがバージョン1.0になって有力候補か? と思いきや CGIで動かすと落ちるバグがあり、しかもなかなか修正リリースが出ないというオチ
そんなに悪いところがわかってるなら自分で作ればいいじゃん
みんな忙しい。
出したコードにはコミュニティ上の責任もたんといかんのでな 書きっぱで後は知らん、というような人はどの世界でもノーサンキューだ
口だけじゃないかw
みんな忙しい。 みんな忙しい。 みんな忙しい。
532 :
511 :2009/08/31(月) 13:04:08
Perl や Python の CGI ライブラリを移植するのはどうだろうね
それは新しい実に新しい
じゃあわかりやすいところで Perl の CGI.pm から始めようぜ
(ぐるぐるぐる) CGI.rb ができましたー 新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ 新機能をガンガン盛り込む人材ってのはとりあえずはコア近辺には要らないんだ
だれだよお前
>>536 >新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ
それどうやって判断するの?人材がいたとして、そいつがおまえのいう条件を満たしているかどうかって、だれがどうやって判断するのさ?
だいたい、CGI.rbなんてtDiaryでもHikiでもつかってるんだろうが。それだけユーザ数が多いのに担当できるだけの人材がいない/いなかったのかよ?
ほんとうに人材が欲しいなら、公式にアナウンスしろよ。このライブラリのメンテな求めてます、条件はこうこうです、と公式サイトに載せればいいだろ。
ろくに求人活動もせずに人がいないだの条件はどうのこうの、言い訳がましいわ。
スレ違いの内容で長文とか勘弁 他でやってね
CGI.rbの上位互換wrapperがあればいいんだよね oreoreCGIなら作ったけど
>>542 あんまりよくないと思う
Rackの修正リリースが出て、標準添付になれば一番いい
配列A1, A2, A3, ... Anから要素を1個ずつ取り出した結果を網羅した配列Xを作る。 ・・・やってくれるメソッドなかったっけ?
>>544 Array#transposeのこと?
ありがとう、調べてみました。近いけど、違う。 p [[1,2], [3,4], [5,6]].transpose # => [[1, 3, 5], [2, 4, 6]] これが下のようになってくれたら期待通りなのです。 # => [[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]
data = [[1,2],[3,4],[5,6]] p data[0].product(*data[1..-1])
てゆーか初心者はきちんとeach使え 小手先だけだと詰まるぞ
>>548 そうかproductか!1.8.7から入ったんですね。それっぽいキーワードで
ググってもなかなか見つからなかった。どうもです。
>>548 行列的操作関連はeach使ったほうがややこしくなりそうな気がする
転置行列は転置行列でしかないわけだし
すまん網羅って見落としてた
それにしてもdata.productって書けそうで書けないのかw
>>548 eachで実装した方法を提示するならともかく
初心者に書かせるレベルにならないと思うぞ
>>551 >eachで実装した方法を提示するならともかく
>初心者に書かせるレベルにならないと思うぞ
+1
def cartesian_product(*data) raise if data.size < 2 data.inject([[]]) do |product, items| product.inject([]) do |r, elem| r += items.map {|i| elem + [i] } end end end
554 :
488 :2009/09/03(木) 05:40:09
無知ですみません。 自分なりに色々調べた結果、Passenger/mod_railsを使っているため、 /manage/の.htaccessが、それによって上書きされているようです。 /public_html/フォルダはRuby railsで開発されており、 今回、/public_html/manage/にPHPで開発することになりました。 私は、Rubyを全く知らない&.htaccess初心者なので、このような事態に陥っています。 RailsAllowModRewrite On を使えば、なおるようなのですが、 /manage/.htaccessでそのように設定しても、/manage/.htaccessに設定してあることが 有効になりません。 どなたか知っていたら教えて頂けないでしょうか。 よろしくお願いします。
日本語もまともに掛けないのばかか
弁護するわけじゃないが普通に分かる おまえがRailsを分かってないだけだろ
たのしいRubyを読み終わったんだが、謎が一つあります。 count = Hash.new(0) ...カウントにkeyとvalueを設定する処理(省略 count.sort{|a,b| a[1] <=> b[2] }.each{|key,value| print "#{key}: #{value}¥n" } とあったとして、「<=>」という演算子が左右のオブジェクトを比較して、 <は-1 =は0 >は1 と返してくるのはわかったのだが、どうやってソート処理されているの謎。 内部のsortメソッドでイテレータが並び替えのアルゴリズムで処理してるのでしょうか。 詳しい解説求む。 ちなみに今まで並び替えのアルゴリズムには目をつぶって生きてきたので、 何種類かあってそれぞれに特徴と効率があるというぐらいしか、あまりよくわかってない。
-1と0と+1というそれそのものには深い意味はないよ 「今持ってるものが挿入先と比べて大きいか小さいか同じか」を調べてるだけ 手に持ってるものが大きかったら“上”に置いて、小さかったら“下”に置いて、同じだったら“横”に置く 普通にリアルに手元で何かを大きさ順に手動で並べ替えるのと同じ処理をしている 実際はもちろん事前グループ分けとか処理順とかにテクニックがあって単純ではないが、 並べ替えの行為そのものに着目した場合、理屈自体は「大きいか小さいか同じか」と一緒
sortメソッドに与えるブロックは「大小の判断基準」 人間に天秤を与えれば重さの大小になるし、ものさしを与えれば長さの大小になるようなもの その判断基準を元に実際に並べ替えるのはsortメソッドの内部で行われる sortメソッドは少量のデータを手軽にソートしたいような ソート手段にこだわる必要のない場合に向いている(大抵は事足りる) もし速度的に不足するような場合はアルゴリズムを選ぶ必要があるし それを自分で実装するかライブラリを使う必要がある
>>560 並べ替えのアルゴリズムに処理をわたす黒魔術ってことでいいですか?
>>561 なるほど、判断基準を渡しているってことか。
イテレータの章で判断基準を渡すってのが書いてあった。
「メソッドがどういう比較処理をおこなうかを渡して欲しい場合がある」と。
その処理がブロックで囲まれた a <=> b ってことか。
謎とけたー。気がする。
なるほど sort{|a, b| a <=> b } の {|a, b| a <=> b } ってなんだよ! いきなり b とか出てくんじゃねえよ! というとこですな
irb> p [5, 4, 3, 2, 1].sort{|a, b| p "a:#{a}, b:#{b}"; a<=>b} "a:5, b:3" "a:3, b:1" "a:4, b:3" "a:2, b:3" "a:4, b:5" "a:1, b:2" [1, 2, 3, 4, 5]
0が偽じゃない言語だから、perlみたいに、比較 or 比較 or 比較 みたいに書けなくて嫌だね なんでもいいなら、-1,nil,1 でよかったんじゃないのか
Cの標準ライブラリにあるqsortも、「比較方法」だけを別関数で 作っておいて、その関数(のポインタ)を引数として渡すような造りになっている。 Strategyパターンですかな。
判断基準を別に設けると、ひとつの枠組みを用意するだけで好きに扱えるからいいよね。 人間配列.sort{|a,b| a.身長 <=> b.身長}だとか、体重に変えてみるとか、逆順にソートしてみるとか。
>>566 (a.身長 <=> b.身長).nonzero? or (a.体重 <=> b.体重)
変数に型がない言語の場合、""や0が偽じゃないことで得られる恩恵の方が多い気がするな 無効値は偽であってほしいけど、正常値を数値や文字列で返す関数などは 0や""も正常値として扱うケースが多い。なので、これらが偽だと、戻り値をそのままブール式につかえない Perlなんかだと、0も""も偽だから、これらも正常値として返す関数の戻り値をチェックするときは、 die "エラ〜" unless defined get_string() とかやって、""のケースを除外しなくちゃならない。|| とか && も有効活用できないし
>>569 それって身長が不一致のときにtrueが返らない?
・・・返値はselfかnilなのか、よくできてるなぁ
0を偽にしろと言ってるのではなくて、0が返ってきてもうれしくないよねってことでしょ
>>573 あぁ、そっか。骨髄反射してた。さーせん
["foo", "Bar", "baZ"].uppereach{|i| puts i} FOO BAR BAZ みたいなマイ繰返子って作れんの?
>>565 黒魔術解明!!ありがと。スッキリしたぁ。
def uppereach hoge.each do |x| yield x.upcase end end みたいな?(Arrayに組み込むのってどうやるんだっけ)
class Array def uppereach self.each do |s| yield s.upcase end end end
newbie氏はブロックがわかってないとみた。 別に黒魔術でもなんでもない。
黒魔術というとevil-rubyみたいな。(よいこは検索しないように)
>>579 今回の場合、yieldに与える処理ってことですよね?
yield自体、今日、たのしいRubyを読んで知ったばかりなので…。
わかってないといわれれば、わかってないはず。
間違ってますか?
yieldって文脈次第でいろんな日本語になるんだな。 イテレータの場合は何だろ。「任せる」?
つまり yield (newbieさん.理解度) てことか
産むかと。
14歳から始めるruby買ったが外した 標準命令の説明あんま書いてないし 内容が詳しくない
「14歳からはじめるC」なら買ったんだけど
標準命令って何?
え、なにこいつ標準命令も知らんののかwwwwバカスwwwwww mesとかfontとかboxfとかくらい使えるようにしとけwwwwwwww HSPの
まあ言いたいことはそれなりに伝わっては来る お勧め本以外をいきなり買っても自己責任でよろしこ
高っかい金出して最初のデカいRuby本を買った初心者の人に比べればどうということはない
オライリーファン登場
Rubyを始めようと思っただけのプログラミング初心者の人には荷が勝ちすぎた薀蓄本だったな 知識さえあれば面白い本なんだけどね
>>593 自分の努力しだいだよ。
基本的なアルゴリズムをすっぽかしてきたみたいだけど
一度自分で手を動かして実装しておくと後の理解が断然楽になる。
バブルソートとか簡単なものだけでもやっとくのがオススメ。
いまどき、ソートのアルゴリズムを自分で書いてるような コーディングなんてしてたら、全面的に見直して作り直したほうがいい。
なんだ、まだそんなこと言ってる人がいるのか 自力でのソートの実装は並び替えをさせるために書くんじゃねえよ 書けるだけの抽象化知識と基礎的な実装力があることが重要 自作のソートのコードを利用する奴は95%までバカだが、 ソートのコードを書けないのは100%ただのバカ
>>569 nonezero?ってながいなあ。nz? くらいでよくない?
よくない
ブロック付きのsortってほとんど使わんよな 大抵sort_byで済む
>>597 本気でそう思うならredmineにfeature request
ソートの基準が2段階のとき sort{|o1,o2| if o1.a != o2.a o1.a <=> o2.a else o1.b <=> o2.b end } みたいに使ってるな
rubyの場合は、配列にして比較するんでしょ。効率の善し悪しは知らないが
Enumerable#sort の場合は Ruby スクリプトに降りてこないから遅いわけではないよ
俺もほとんど.sort_byだなあ
>>596 > 自作のソートのコードを利用する奴は95%までバカだが、
> ソートのコードを書けないのは100%ただのバカ
うむ
説明からソートをコードに起こせない人は時々いて、そういう人は例外なくアレ
ソートをコードにする練習はソートくらいでしかうまく鍛えられないから、
初心者のままでいいと思ってないのなら文句言わず今自分の手を動かしてやるべき
>>601 > ソートの基準が2段階のとき
でも条件が単純ならば大抵sort_byですむ
ブロック付sortなんてsort_byが出来てから使ったこと無いなぁ
A=Struct.new(:a,:b)
a = [A.new(2,4),A.new(2,1),A.new(1,5),A.new(1,1)]
p a.sort_by{|o| [o.a,o.b] }
文字列中の数字を数としてソートするなんかだとどう書くんだろう?
a = %w(3a 20a 100a b9 b80 b700 a9b100 a10b100)
p a.sort_by{|e| e.scan(/\d+|\D+/).map{|e| e[/\d/] ? ['0',e.to_i] : [e]}}
こんなんでいいのかな?
アルゴリズムの勉強していたら夏休み終わってたんだが。
>>608 ユークリッドの互除法を理解しただけで夏が終わった俺よりマシだ
気にすること無いぞ
610 :
デフォルトの名無しさん :2009/09/04(金) 20:14:34
Ruby 1 初めてのプログラミング(arton/宇野るいも 著)を買ったらRuby1.9.1が付いて来たんだが。
具体的に不便なところ(使えないもの)を教えてもらえないだろうか?
あと、このサイト(
http://www.rubylife.jp/ini/ )にある、
『オプション指定をプログラム内に記述』というソース内で文字コードを指定する方法が実行できないのだが、
1.9.1では使えないということなのだろう?
誰か頼む。
英文テキストを送って翻訳サイトで日本語化してstdoutに文字列表示するサンプルどっかにない
使えないだろ。嘘言うな
>>612 すげ〜。ありがとう。
いい加減CGIも勉強した方がいいのかな。
あとまだ10年くらいは通用する技術なんだろうか。
誰かruby-1.8.6-p383をgcc4.4.0のmingwでビルドしてない? make testしたらエラー出るんだけど。 not ok float 1 -- ./sample/test.rb:1172 not ok float 2 -- ./sample/test.rb:1173 not ok float 3 -- ./sample/test.rb:1174 って感じでエラー。
>>615 CGIもできないヤツがHTTPでなにかできるとは思えないから
通用云々よりまずできるようにしとけ
PerlのURI::Fetchに相当するような、CacheつきWebクライアントはないでしょうか?
vim-rubyをインストールしたのですが、vim-ruby-install.rbのセットアップが上手くいきません。 $ gem install vim-ruby >WARNING: Installing to ~/.gem since /usr/lib/ruby/gems/1.8 and /usr/bin aren't both writable. >WARNIG: You don't have /home/****/.gem/ruby/1.8/bin in your PATH, > gem executables will not run. >Successfully installed vim-ruby-2007.05.07 >1 gem installed $ sudo vim-ruby-install.rb >Can't find source directory. 上のように出力されてvim-rubyのセットアップができません。 気になるのが、/usr/bin/vim-ruby-install.rbファイルは存在するのに/usr/lib/ruby/gems/1.8/gemsディレクトリにvim-rubyが無いのです。(gemからインストールした他のgemパッケージは全てここにある) しかしgem listコマンドを叩くと他のgemパッケージとともにvim-rubyが出力される。 何か分かる方がいましたら教えてください。よろしくお願いします。
>>615 >>617 ajax で javascript が開発の中心になっても CGI は細々と生き残るだろう
ただし HTML は javascript の単なる loader になり
CGI はバックエンドとしての RDB - XML translator になり下がる
ぽかーん。
pythonのようにコンソール上でコマンド1つ1つ実行させて 動作を確認させることはできないのですか?
つirb
RubyでCGI(笑)
>>619 眠いから論理的に読んでないが、
gem は sudo したとき(/usr に書き込み権限があるとき)と
一般ユーザーで使用したとき(/usr に書き込み権限がないとき)とで使用するディレクトリが違う
完全自動で /usr/bin にインストールして欲しいなら最初から sudo gem install しろ
gem install すると gem は $HOME/.gem/ruby/1.8 とかに入る
昔は全員が sudo しまくってたんだが、最近は sudo しないインストール方法が市民権を得ている
いまだに Rakefile で sudo ベタ書きしてるライブラリがあるがとっとと死んでくれてよい
へ?なんで?意味がわからない。
630 :
610 :2009/09/05(土) 06:37:13
>>613 そのサイトの該当部分は、正確には『Ruby入門 >日本語と文字コード >オプション指定をプログラム内に記述』だった。
すまん、言葉が足りんかった。
プログラムだが、これ↓を実行すると、
#! ruby -Ku
print("KCODE=", $KCODE);
こう↓なる。
test.rb:2: warning: variable $KCODE is no longer effective
KCODE=
いやそれはメッセージがそのまんまだが っていうかこれの経緯の解説が無いならその本投げ捨てろ $KCODE が動作するのは 1.8 までで、1.9 からは別な方法で指定する
こういう場合大抵その本に罪はないw
634 :
610 :2009/09/05(土) 08:48:43
>>631-632 答えてくれてありがとう。
632のリンク先は自分が勉強不足なせいで何言ってるか半分も理解できなかったがw
本にはマジックコメントを使うと書いてあったんだが、ネットで調べてみたら別の事が書いてあったんで混乱したんだ。
やっぱり別の本買えばよかった(´;ω;`)
>>632 はまだ理解できなくても問題ない
これは Ruby1.8 をある程度修めてて
なおかつエンコーディングの日常的知識があることを前提としている一次文書だ
Ruby 1.9.1 で初めてプログラミング言語に触れる人だとか
文字エンコーディングってナンデスカという人だとか
そういう人向けの文書ではない
そういう人向けの解説はこれをもとに出てくる…はずなんだが、ばあさんやまだかいのう
>>615 CGIというか、HTMLを使った基本的なWebアプリが作れるようになれば便利
あと10年ぐらいは、HTMLやHTTPが無くなることはないだろう
今さすがにCGIはなあ、とか思うんだけど、 で、まあwebアプリを初心者に勧めるとして何するのが(どんなライブラリ使うのが)いいんだろ。 Railsはでかいは、デプロイ面倒だわ、慣れるとすごくいいいんだけど、初心者がいきなりやるには…。 Sinatra辺りだろうか?
CGIが書けずにフレームワーク扱いだす新人PGって、 交通ルール知らずに車運転するようなもんじゃないだろうか
どこぞのフレームワークと違って やって無駄になるような技術ではまったくないね
比喩は嫌いだ
webアプリ初心者が序盤に作ったモノはひどいデキになって当たり前なんだから まずはライブラリなしの生CGIでいいんだよ 薄っぺらい仕様だからとっかかりにはちょうどいい セキュリティはこの際忘れろ、ローカルでやるかbasic認証でもかけて隠しとけ セキュリティやらフレームワークやらはCGIの基礎がわかってから考えろ
KENTととほほを知ったことには感謝しなければならない
>>642 で納得していただろうから
「考えない」んだよな そりゃそうだ、今の時点で「動作してる」のに、何を付け加える理由があろう むしろ、安全じゃない文字の基本的テストが標準付属していて、 それを通さないとそもそも動作しないとかそういうフレームワークがあれば
Railsの話題なのですが、rubyに共通する話なのでこちらで聞いてみます。
スクリプトのデバッグにruby-debugを使ってみているのですが、
b(break)コマンドでブレイクポイントを表示してくれず、現在行がブレイクポイントに追加されてしまいます。
ブレイクポイントを表示するにはどうしたらよいのでしょうか?
下記を見ると、breakでブレイクポイントの表示のはずなのですが・・・???
debug - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/debug.html ruby-debug 0.10.3
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Ubuntu 9.04 (coLinux)
646 :
645 :2009/09/05(土) 17:54:55
どうも、ruby-debug 0.10でコマンドが変わっていたみたいです。
下記サイトが参考になり申した
Ruby On Rails ピチカート街道 - Rails 2.0・その10(ruby-debugコマンドマニュアルv.0.10.0 デバッグの方法が簡単に) -
http://rubist.blog77.fc2.com/blog-entry-114.html 具体的には、b(break)ではなく info breakpointsでブレイクポイントを表示できるみたいです。って面倒くさいくなっとるやん!!
とにかく解決しました。ありがとうごっざいました。
647 :
610 :2009/09/05(土) 18:40:01
>>636 これは……RoRをやれ、ということか?
いずれRoRをやろうと思ってたからありがたいのだが、これでRubyも勉強できる?
嗚呼、RoRはRuby1.8.7対応か。畜生、4000円パーだ。
>>647 それは著者がarton氏+初心者にRoRを進めるというギャグ
まずは一冊目をじっくり勉強してみたらいいんじゃないか
それから1.8前提の既存サイトで勉強しても全く問題ないよ
>>610 は「初めてのRuby」(オライリー)を買っておけ。
あれ一冊読んでおけば今回のようなつまらないことで迷うことはない。
yugui本か。 公式の愛称はキリン本らしいけど…… 他の言語の経験があれば、よい本。
653 :
619 :2009/09/05(土) 23:10:49
>>627 ありがとうございます。
アドバイス頂いたとおりsudoコマンドでインストールしてみましたが、 それでも$HOME/.gem/ruby/1.8以下に入ってしまうようです。
sudoではなく、suコマンドでrootになってからgem install vim-rubyとすると、/usr/lib/ruby/gems/1.8/gems以下にvim-rubyディレクトリが作成されました。
一般ユーザーでgem installすると$HOME/.gem以下にパッケージが配置されるだけで、uninstallコマンドも効かず自力でディレクトリ削除するしか無いようですが、これが一般的な方法なのでしょうか?
データ書き込み用にカレントディレクトリに temp.txt を作成する。すでに有るなら失敗する。 という処理をアトミックに書く方法を教えてください。 openじゃ無理ですか? ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
unix系ならこれで行けるけどWindowsはわからんなあ open('temp.txt',File::EXCL|File::CREAT|File::RDWR)
…
一発1行で書きたいなら
>>655 がそのまんまだが、これはちとわかりにくい
普通に長々と条件分岐させたほうが得策かもしれない
……
アトミックが要求される場面で長々とは書けないんじゃ?
アトミックとかもう初心者スレの話題じゃないだろう
わかりにくい以前に File::EXCL|File::CREAT|File::RDWR の意味を調べる術がないという
>>654 ロック処理をきちんと書くべきだと思う
もしくは、ロック処理をやってくれるライブラリを探すか
適当でいい(とりあえず動けばいい)ならflockでOK
>>659 このスレで扱う「初心者」がRubyなのかプログラミングなのかだなw
いや、やりたいことからしたら
>>655 しかないだろ
初心者スレだからって何をとんちんかんなことばかり
↓ここでお手本になるような排他制御のサンプルを一つ
シンプルに、追記でopenして読み込んでからの分岐だけではいかんのか? 目的がわからんのでなんとも言えんが。
……
>>664 ヒント:リファレンスにFile::EXCLの意味が載ってない
RubyとPythonはどっちが強いですか?
Rubyのドキュメンテーションのダメさは異常
ハイレベルPythonユーザーのアプリケーション製作能力は異常 が、その下の層が薄い印象 Rubyはハイレベルユーザーの数が多くない代わり、中級ユーザー層が厚い感じ Python自体は凄いんだが、高次に使いこなすための敷居があまりに高すぎる
Pythonは具体的にどうすごいんだ?全く知らんのだが
endを書かないことで最大1.5倍程度ソース密度が高まる
それで敷居が高いのかw
Pythonにはギッチリよりスカスカをよしとする哲学と78文字制があってだな
676 :
デフォルトの名無しさん :2009/09/06(日) 10:59:49
CentOS release 5.3 (Final) ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux] gem install hpricotで、hpricotをインストールしようとしているのですが、 ビルドエラーが出てインストール出来ません。 どのようにしたらインストールできるでしょうか。 よろしくお願いします。 Building native extensions. This could take a while... ERROR: Error installing hpricot: ERROR: Failed to build gem native extension. /usr/local/bin/ruby extconf.rb checking for main() in -lc... yes creating Makefile make gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_css.c hpricot_css.c: In function ‘hpricot_css’: hpricot_css.c:3399: warning: comparison between pointer and integer gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_scan.c cc1: out of memory allocating 481668 bytes after a total of 13987840 bytes make: *** [hpricot_scan.o] Error 1 Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1 for inspection. Results logged to /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1/ext/hpricot_scan/gem_make.out
>>670 Perlのドキュメントのなさほどひどくはない
これわひどい ウェブ 検索ツールを閉じる検索ツールを表示 excl ruby に一致する日本語のページ 約 1,180,000 件中 1 - 50 件目 (0.44 秒) もしかして: excel ruby 検索結果 1. Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel 2. Rubyist Magazine - RegionalRubyKaigi レポート (01) 東京 Ruby 会議 01 3. Take it easy!: Ruby とエクセル 4. はてなブックマーク - { B!} - excel - Ruby on Rails 5. はてなブックマーク - kedmブクマ - excel - ruby 6. RubyでExcel - Ruby/Rails・Web系プログラム情報まとめ
ごめんなさい。再起動したらいけました。
>>668 See man open(2) for more information.
ここに書く暇あったらwiki直せよw
rdocで定数の説明ってどこに書くんだっけ
>>685 この方、あんまり、物事を嫌い嫌い言うのって敵作るだけだから止めた方がいいと思うんだけどね。
webに不満をぶちまけること自体はかまわんと思うが。
しかし、schemeが日の目を見ないって嘆いているのが、現実を見れていないようなのだし、
前述の件もあるからあまり関わるのはよしたほうがよさそうw
まあでも世の中はどう転ぶかわかんないから なにそれおいしいのだったOOPも今や知ってて当たり前だし
>>670 っていうか、明らかに「日本人のドキュメンテーションのダメさは異常」なんだよな。
日本人のタッチするところ、ドキュメントの無い世界が広がるってなもんで。
それは、外国人の書いたもので日本で使われるようなものは、 ドキュメントがあるものだけだからな。視野に入ってないだけ。
>>687 いや、個人の好き嫌いを述べるのは別に構わんと思うが。
「海外のブログでは批判記事も目にする(そして、その筆者も知らないのに叩く
なと逆に叩かれる)ことが結構あるのに、日本ではこれが非常に少ない。」
と書いてる通り、叩かれることも自ら望んでるんだろうし。
そろそろ隔離スレ行こうね
>>691 批判とかツッコミはやめたほうがいいよ。スルー推奨。
過去の記事を読めばわかるけど、実は極度に打たれ弱い。
> 実は極度に打たれ弱い。 叩き甲斐があるってもんじゃないか
いや全然 オモチャが極端に少ない生活してるんだな
>>697 > 叩き甲斐があるってもんじゃないか
叩き甲斐とは、叩かれ強い人を精神病院送りにした時感じるもの。
うざい
マジで本人乙
うざい
,.、 .,r.、 ,! ヽ ,:' ゙;. ! ゙, | } ゙; i_i ,/ ,r' `ヽ、 | ,.、 ,r.、 ,i" _, ._ ゙; | ,! ヽ,:' ゙;. !. ・ ・ ,! | ! ,! } ヽ、 x _,r'' |二゙; i二二二(⌒ノ"''`''''''''''''"´`ヽ. | ,r' `ヽ、 ´ヾ、 l l ,i" _, _ ゙; ! i___| !. ・ ・,! | t,ノ |ゝ_ x _::' !、、、、、、、、、、! |,/"`''''''''''''''"´';, | | | (,;! !) | | | |゙''::r--、::--;r' |____|_____| |―゙'ー-‐゙ー-゙'―┐ (,,,__(,,,____)
705 :
697 :2009/09/06(日) 20:54:13
>>699 うん、オモチャで遊ぶときは今のオモチャを壊してから次のオモチャで遊ぶもんでね
一つのオモチャで2回遊んだことないんだ。
ほんとに基地外スレ・・・
そんなにほめてくれなくても(赤面)
なにそれこわい
MoonGiftだっけ?
Ruby上でPythonを走らせる実装にRuby/Pythonがありますが 逆にPython上でRubyを走らせる実装ってありますか? BlenderでRubyを使いたいです・・・
ruby-1.8.6-p383をgcc4.4.0のmingwでビルドする場合は、 ルートのMakefileのCFLAGから-O2を外してmakeすれば良いみたい。testとtest-all通った。 ruby-1.8.7-p174はtestは通ったがtest-allするとtestが全然始まらない。重いだけかな?
確かな匂い
次のエントリもひどいな。これは、もはや才能。
本人のブログに突撃するのはかわいそうだからやめようね。 突っ込みたい人はここでどうぞ。好きなだけ突っ込んであげて。
RubyのeachへProc渡し p = Proc.new {|x| print(x) if (x == 2) return end print(', ') }
本人はココに常駐してるのかw
もう触れるなよ エントリ更新するたびに出てくるようになるぞ
MoonwolfってRubyistだったと思ってたけど、いつの間にRubyぎらいになったんだ
dailsとか出てくるのかな
Hello world
変なのが消えて、また過疎スレ化するのかな・・・ そういえば夏も終わりだねぇ
実は自分がその「変なの」だったっていうオチって怖くね?
何その林先生案件
>>723 さっぱりわからん。頑張っても14Bしか出来んかった
Hello world だけで 11 バイトだからなぁ。 PHP なら 11 バイト可能だけどw
Hello, world! お題がこれだから13byteでPHPでも無理
「単純なやり方では」無理、だ なにかしらの圧縮かけてんだろうけど・・・
短縮系golfは初心者の得るものはないので他スレでやっとくれ
>>731 gorubyはむしろhだけだった記憶がw
exec禁止じゃないから、gorubyを呼び出してるんじゃないかと思うが。
s = "aaaaaaaaa[hoge]piyopiyo" r = "[hoge]piyo" if s =~ /#{r}piyo/ puts $& end 今日こんな感じのコード書いてマッチしねえってことで しばらくはまってた
>>738 気持ちは分かるw
p /#{r}piyo/ #=> /[hoge]piyopiyo/
p /#{Regexp.escape r}piyo/ #=> /\[hoge\]piyopiyo/
putsとかpとかprint以外のメソッドに括弧をつけない男の人って
自作メソッドにしか付けねーよ
括弧は出来るだけ付けるのがナウいんですか? 今までその逆をしてました・・・ごめんなさい
カッコがない場合は「わざと」外してる それは p だったり puts だったり DSL っぽく書く意図だったり カッコの有無で動作が変わることを経験した人はカッコつけるのを基本にすると思う
引数無しメソッドでもつけるのが最近のマイブーム ああ、これ関数だなって一発でわかるし
普段はまあどっちでも好きなようにしろ、が回答 紛らわしいときに ( ) が使われているのなら普段が ( ) ありでもなしでも構わない 問題は、普段からカッコつけない奴の多くは「紛らわしいとき」を全く意識しないということ たまたま動いてるのを普通にスルーしやがる 普通逆だろ、カッコ常につけまくってる奴のほうがカッコの有無に無頓着であるべきだろ
kimoi
obj.method arg とか死ぬほどキモイな
メソッドチェーンがない言語の因習だと思う
Moonwolf説はガセ
railsのソースコード読んでruby覚えた俺はカッコ無しの方がしっくりくる メソッドの戻り値も変数に格納しない
1.9.2で、mingw32の4.4.0のpthreadってdisableしてビルドした方が良いのかな?
>>751 よくはないが、別にそんなクリティカルな用途で使うわけでもないだろうし別にいいんじゃね
Perlでいうところの関数のリファレンスを変数に格納して実行するにはどうすればいいのでしょうか? --- Perl --- sub func { print 'func' } $func_ref = \&func; $func_ref->(); --- Ruby --- def method print 'method' end method_ref = ???? method_ref.call?? こうするしかないのかな? method_ref = proc { method } method_ref.call
>>754 Kernel#__send__(文字列 or シンボル, 引数...)
Method#call(引数...)
UnboundMethodをbindして#call(引数...)
など。
>>754 Object#method #
>>755 の真ん中の奴
def func ; puts 'func' ; end
func_ref = method(:func)
func_ref.call
>>751 --disable-pthreadでconfigureするかどうかってこと?
意味ないからどっちでも同じ結果になるよ。
>>758 サンクス
そうするとstruct timespecが二重定義って怒られるのはどうしよう
>>759 redmineで報告すればいいんじゃないかな。
Rubygemパッケージを作るための色々なファイルの雛型あきこしてくれるライブラリとかありませんか
トップレベレと言うのか、どこのクラスにも属さず、 いきなり書いた一行の文って、どう考えればいいの? Cで言うmain関数みたいなのに暗黙のうちになってるとか、 Javaで言うmainメソッドみたいなのに暗黙のうちになってるとか、 ・・・どう解釈したらいいのだ?
>>761 $ jeweler --rspec hogeeee
create .gitignore
create Rakefile
create LICENSE
create README.rdoc
create .document
create lib
create lib/hogeeee.rb
create spec
create spec/spec_helper.rb
create spec/hogeeee_spec.rb
Jeweler has prepared your gem in hogeeee
$ ls hogeeee/
LICENSE README.rdoc Rakefile lib spec
>>762 トップレベルにも self として参照できるオブジェクトがある。
ほとんど単に Object.new したものだが、文字列化すると main
と返すようになっている点だけちょっと違う。
puts self
#=> main
p self
#=> main
puts self.class
#=> Object
>>763 これ知ったとき、spec_helper をどっかの rubygem からコピペして
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
を全ファイルの先頭に自力で書いてた俺超涙目
メソッド内部で print とかされて標準出力に表示されている結果を rspec でチェックすることはできませんか?
putsはObjectがincludeしているKernelのメソッド。 putsを呼ぶ時点のselfにspecからアクセスできるなら ソレ.should_receive(:puts).with(出力) などで可能だと思う。
>>767 $stdout = StringIO.new
で溜め込むとか
>>768 「メソッド内部」と断ってるし普通アクセスできないと思う
>>770 class Greeter
def hello(name)
puts "hello, #{name}"
end
end
このような位置のputsはspecで
@greeter.should_receive(:puts).with('guest')
でテストできるけど、さらに奥深くだと無理だろうってことね。
内部ってどのくらいなん、というのに依存するな
汎用的なのは$stdoutねじ曲げる
>>769 か
これ使ったことあるけど、なんかrspecで書いてる気がしないんだよな
stdout マッチャとか display マッチャとか作るべき
そりゃまあ、らしく書くのに実装の隠蔽は欠かせない
lambda{ @obj.greeting }.should display('hello!') こんな感じ? Proc オブジェクト使うのはこれはこれで微妙に不評なんだよね
>>763 ジュエラーか。ジュエリストのほうがかっこいいな。
最近ご無沙汰なんだが、hoeとかnewgemはもう古いの?
hoe がイヤ過ぎるから newgem や jeweler が出てきたのでは…
hoeとかrubyforgeとかって基本的にgemを作るときに要るもので、 配布物を使う人には無用のものだと思っていたのだけど、 なんで依存しているgemがあるんだろう、という疑問。
778 :
777 :2009/09/09(水) 18:59:06
自己レス。 作者がadd_development_dependencyを知らないだけなのかな。
ある文字列をN文字ずつに分解するのはどうやりますか。 たとえば 'abcdef' を2文字ずつに分解して ["ab", "cd", "ef"] のようにします。 よろしくお願いします。
N = 2 'abcdef'.scan(Regexp.new('.{%d}' % N))
すごく初歩的な質問なのですが、Rubyのドキュメントはどこにあるのでしょうか?皆さんは何を参照していますか? 公式HPを見ましたが、Rubyの文法を簡単に説明しているだけで、標準ライブラリの細かい仕様を調べたい時などには役に立たないと感じました。 たとえばgemにインストールしたライブラリであればgem serverコマンドでRDocリファレンスが見れますが、標準ライブラリのRDocのようなものは無いのでしょうか? バージョンは1.8でも1.9でも構いません。よろしくお願いします。
783 :
781 :2009/09/10(木) 00:50:23
www.ruby-doc.org/core でいいんじゃね?
職場の頭の悪いJava厨が
>>783 と同じようなこと言ってたな
788 :
デフォルトの名無しさん :2009/09/10(木) 02:03:14
Rubyって連結リストみたいなListのデータ構造はないのでしょうか? 配列とハッシュしかみあたらないのですが。。。
>>788 連結リストを何に使うの?
キューやスタックなら配列で十分だぞ(#shift, #unshift, #push, #pop)
Lispの処理系を作るとかいう話なら自分で作るべき
>>779 5文字を2文字ずつとかしたとき余った文字って捨てていいの
>>792 /../n の、n オプションって何?調べたけど見つからない
>>793 str.scan(/..?/)
Nが正の整数で可変なら、
r = '.' + ('.?' * (N-1))
str.scan(Regexp.new(r))
でいける?
うーん。正規表現よくわからん。
どうなんだろうね 端数出ないと仮定してもよさそうだが require 'enumerator' "12345".split(//n).each_slice(2).to_a.map{|a| a.join} ["12", "34", "5"]
>>794 > Ruby は日本語化されているので、$KCODE の値に従って正規表現中の日本語文字を正しく扱います。
> $KCODE = "n" の場合、日本語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作です。
> オプションとして n, e, s, u のいずれかを指定することで
> 正規表現の文字コードを $KCODE の値に関係なく個々の正規表現リテラルに指定することもできます。
irb> $KCODE = 'u'
irb> p 'うんこ'.split(//)
["う", "ん", "こ"]
irb> p 'うんこ'.split(//n)
["\343", "\201", "\206", "\343", "\202", "\223", "\343", "\201", "\223"]
文字列が完全にASCIIの範疇しか使われないならぶっちゃけいらない
ASCII 文字の処理だからと n をつけまくってる人は時々見るが、つけないほうがいい時のほうが多いと思うんだ
thx 文字コードの指定ですか 1.9以降はどうなるんだろ
無指定の場合は対象文字列の encoding と同じだとみなす irb1.9> p "しふとじす".encode('Shift_JIS').split(//) ["??", "??", "??", "??", "??"] irb1.9> p "しふとじす".encode('Shift_JIS').split(//).map{|e| e.encode('UTF-8')} ["し", "ふ", "と", "じ", "す"] split(//n) と同じことをするのはやや手間 irb1.9> p "しふとじす".encode('Shift_JIS').dup.force_encoding('BINARY').split(//) ["\x82", "\xB5", "\x82", "\xD3", "\x82", "\xC6", "\x82", "\xB6", "\x82", "\xB7"] each_byte の結果を文字列にしたほうがたぶん妥当 あるいはなんか凄い人が凄い簡単な手法見せてくれるかもしれない
余った文字も入れたけりゃ N = 2 'abcde'.scan(Regexp.new('.{1,%d}' % N)) => ["ab", "cd", "e"]
>>772 はカスタムマッチャ作ればすぐじゃん、と思ったが
「そのメソッドからの $stdout への出力」というのを限定して取れないことに気づいた
$stdout を曲げてる期間に他の何かからも $stdout に出力があれば混じってしまう
や、「テスト中にはそんなこと起こらない」ということにすればいいんだけども
module MyCustomMatchers class MatcherDisplay def initialize(expected); @expected = expected; end def matches?(proc) old = $stdout.dup; out = StringIO.new $stdout = out; proc.call; $stdout = old out.rewind @actual = out.read return (@actual == @expected) end def failure_message "expected stdout is #{@expected.inspect} but was #{@actual.inspect}" end def negative_failure_message "stdout #{@expected.inspect} should not be same" end end def display(expected) MatcherDisplay.new(expected) end end describe "Test" do include MyCustomMatchers it "say hello" do lambda{print "hello!"}.should display('hello!') end end
あ、$stdout を dup する必要ないや そのへん適当に あとメッセージも適当 failure_message が should が失敗したときのメッセージ negative_failure_message が should_not が失敗したときのメッセージ モジュール作って include 形式にはしなくても構わないがこうしたほうがきっとあとで楽
>>785 >何を言ってるんだおまえは
おまえこそ何を言っているんだ。
Ruby初心者では、782で紹介されたページから、ライブラリのドキュメントまでたどり着けないことがあるという事実がわかったんだから、
初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?
たとえば
ttp://doc.okkez.net/static/188/doc/index.html のページを見ると、言語仕様の目次がずらーっと並んでいて、ライブラリのドキュメントへのリンクは後ろのほうにあるだけ。
これだと、
>>783 のような勘違いが生まれても仕方ない。
そうじゃなくて、このページから目次をなくして、
「言語仕様」「組み込みライブラリ」「標準添付ライブラリ」「その他」
の4つの大きなアイコンが並んでいるだけにすれば、
>>783 のような勘違いもなくなると思うんだけど、どうだろうか。
・・・という感じで、初心者が必要なドキュメントにたどり着けるようにするにはどうしたらいいかを話し合ってほしい。
せっかくの初心者スレだし。
>>803 そこはサイトを作ってる奴が○○○ので仕方ないかと。
いいじゃん、ruby-doc.orgの英語ドキュメント充実してるんだから、そこを見れば。
> 初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか? こんなチラ裏掲示板で話し合っても全く建設的ではありません。 プロジェクトに提案があるならメーリングリストへ。
>>798 unpack("C*").map(&:chr)
>>781 の時点で見つけられないのはわからないでもない
でも回答があったにも関わらず目に付いた部分しか見ずに探そうとしない
>>783 ようなのはただのバカだろ
バカの世話までしていたらキリがない
each_byteのほうが短かった
>>802 テストで標準出力奪うのはやめといたほうが…
テスト自体の出力が混ざるぞ
>>809 おう、今まさに混じってるぞ
何が辛いってうっかりメソッド側で p とかしてオブジェクトの中身確かめようとしたら
標準出力に p の結果が混じってテストが失敗すること
warn obj.inspect で逃げてるが display マッチャのコンセプト自体が間違ってたとしか思えん(w
>>779 BioRubyを入れるとString#stepが拡張されて
require 'bio'
'abcdef'.step(2){|a| puts a}
ab
cd
ef
とできる。割り切れなければ最後に余りが返ってくる。
まあ、これだけのために使うようなライブラリじゃないし、
マルチバイト文字も使えないけど。
>>805 ここだから書き込むやつがいるんじゃないか
わざわざメーリングリストに入って発言なんかするかよ
どうせたいした議論なんかしないんだから。
現状このチラ裏でいろいろ書かれているわけだから それを無視しているメーリングリストの人たちのほうが非建設的
本買えばいいじゃんとしか思わない
本なんて邪道と思ってるやつもいるからな おれには理解できんが
ri にキャッシュ機能を付加したフロントエンドを被せるとそこそこ快適 refe というリファレンサもあることは知ってるけど使ったことないや。 使ってる人いる? インストールめんどくせ、というイメージなんだが
>>817 refe使ってるけど、アーカイブを展開してパス通すだけじゃね?
RubyでHTTP caching proxyを作ろうと思うのですが、Perlの
HTTP::Proxyに 相当するようなライブラリはないでしょうか?
webrickにhttpproxyというのがあるけど、希望に沿えてるかはわからない
rubyのMLってオナニーメールばかりで気持ち悪い
日本語のは、メール自体が少ないから
>>772 newgemでbinつき、rspecつきで出力したのが参考になるかも
binのスクリプトのスペックファイルがこんなのになってる
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
require 'tweetswget/cli'
describe Tweetswget::CLI, "execute" do
before(:each) do
@stdout_io = StringIO.new
Tweetswget::CLI.execute(@stdout_io, [])
@stdout_io.rewind
@stdout = @stdout_io.read
end
it "should print default output" do
@stdout.should =~ /To update this executable/
end
end
あらアプリ名でちゃった。はずかすぃ!
>>824 要は出力対象を差し替え可能にしておけってことじゃね
class C
def initialize(out = $stdout)
@out = out
end
def exec
@out.print "message"
end
end
どうでもいいけど○○wgetとかwget○○とかってセンスないよね Wgetクラスとか作っちゃうのもセンスないよね system("wget #{url}")するよりはマシだけどね
ほぼ全員が作ったことがある黒歴史っぽい感じでセンス無くて恥ずかしいよな OptParserの練習にもなっていいんだぞ、多分
センスっていう言葉を使う奴って語彙が乏しいよね
open-uri.rbに記述されてる説明なんだけど、誰か訳してもらえませんか。 respond toの意味するところが分かりません。 makes possible to open various resources including URIs. If the first argument respond to 'open' method, the method is called with the rest arguments.
>>831 ありがとうございます!なるほどrespond_toメソッドのことでしたか。
ruby(というかプログラミング)特有の言い回しは慣れないと難しいですね。。
下記のような、Item.find(params[:id]).hogehoge という部分だけが違うメソッドがあります。 def move_lower Item.find(params[:id]).move_lower flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end def move_higher Item.find(params[:id]).move_higher flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end def move_to_bottom : def move_to_top : (うつく)
(うつき) DRYしたくて、この場合、どのような書いたものでしょうか? 例えば、以下のような感じにしたいのですが、Item.find(params[:id]).methodのところがうまく行きません (´・ω・`) def move_lower do_move(:move_lower) end def move_higher do_move(:move_higher) end def move_to_bottom do_move(:move_to_bottom) end def move_to_top do_move(:move_to_top) end def do_move(method) Item.find(params[:id]).method # ←????? flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end
>>835 Item.find(params[:id]).__send__(method)
あまりDRYに見えない気が。
>>836 いけますね
Item.find(params[:id]).send(method)
ではダメなんで書馬、
微妙に書き方間違えた、Object由来の__send__とsendの話 class C def send; end # Cの都合に合わせたsendに書き換えてOK # def __send__; end # __send__の再定義はマナー的にNG end Itemの中身は(ほぼ)間違いなくObject由来のオブジェクトだからsendも__send__も使えるけど sendが再定義されたクラスの可能性もあるから Object#sendの機能が使いたいなら__send__のほうが確実ということ
ごめんちょっとテスト -スペース×2 -全角スペース -
失礼しました nbspな書き込みが多かったから2ch側で自動的に置き換えてくれるようになったのか、 と思ったけど違ったみたいだ
send は利用専用 再定義のないプレーンな状態では send が使えてしかるべき object_id と __id__ の関係に近い 個人的には __class__ もあってしかるべきだったと思うのだが あんま __ つきメソッド作ると Python ぽく動作しなければならない気分になるかも
>>842 navi2ch は文頭から始まるスペースを に書き換える
本来はやってはいけないことなんだがまあそれはそれで
845 :
デフォルトの名無しさん :2009/09/11(金) 05:35:48
目茶初心者的な質問です。 RubyのThreadでの引数の役割りって、何ですか? (どういう場面で役立つのか分からない) 関数なら y = f(x) で引数xを元にyが決定されプロット できますが、Threadも左右されるのでしょうか? すいません、ググっても分かりませんでした。
引数なんだからルーチン実行に必要な明示的外部因子だろ という話ではなさそうだな Thread.new の引数の話なら、これはそのまんまだ 説明読んで実際に動かしてみてわからんのなら、きっとまだ早い 1ヵ月後くらいに再読すると結構わかるので今は諦めれ
847 :
833 :2009/09/11(金) 06:34:05
>>836-843 ありがとうございます。
本当だ、Railsだとsend上書きしてたりしますね。
ちょっとした使い分けですね。上書きされるような挙動を許したければsend、
そうでないなら、__send__
使ってみます。ありがとうございました。
メッセンジャー機能として上書きするために残ってるんじゃないぞ 「送る」メソッドとして名称が被ってもいいように __send__ がある たとえばメール用ライブラリでは送信用のメソッドがどう考えても send になるが、 そういうクラスで send を作っても元の send の機能が失われないように __send__ がある 他の Object のメソッドはまあ上書きで消えちゃっても仕方ないかなあと思えるものが多いが、 send の機能だけは特別 この機能が使えない状態のクラスは Ruby としてヤバい
>>844 インライン要素に囲まれた空白文字は空白として保存する、みたいな仕様になっていれば
今ごろ世界中ハッピーだったと思うんだ
851 :
833 :2009/09/11(金) 09:34:56
>>850 あー、ほんとうだ。
Railsのsend(ActiveRecord)と、Socket#sendは全然意図が違いますね。
前者はフックして処理追加みたいな感じですが(superよんでるし)、
後者は、__send__関係ねえw
上の方で教えていただいた事柄は、後者のことですね、たぶん。
別の意味のsendが定義されてる場合、__send__よべと。そりゃそうだ。
Railsの場合は、むしろ、sendとしてsendが呼ばれるのを期待しているみたいなので、
__send__直接でなく、sendを呼んでやらないととおかしなことになりますね。
ソケットにrecvとsendがなかったらアルェーってなるだろう
class クラスのインスタンスを「足し算」することはできませんか? bar = Foo::Bar.new baz = (bar.class + Class.new('Baz')).new p baz.class #=> Foo::Bar::Baz eval するしかないとしたら、なにかより安全な方法はありますか?
何がしたいかわからん。 Foo::Barのスコープ下に可変な名前の新クラスを定義したいという意味?
>>853 できね
文字列としてクラス名を適当に作ってからevalしろ
定数になる書式しか受け取らないevalはあれば楽しいが多分無い
>>854 の意味なら
new_class_name = 'Baz'
Foo::Bar.const_set(new_class_name, Class.new)
ドキュメント表記でFoo::Hogeと書かれている場合のFooとHogeの関係は、 ○HogeはFooの内部クラス ○HogeはFooの内部モジュール ○HogeはFooで定義された定数 のいずれかと思っていれば間違いないでしょうか? ドキュメントを見て自分で調べた限りではこのような使われ方がされているようです。 継承したクラスや、インクルードしたモジュールなどは、Hoge::Fooのような書き方をしていないようなのですが、継承・インクルード用の表記法はあるのでしょうか?
意味的にはそれであってる、実装的には三つ目に集約される というのもクラスもモジュールも、ClassインスタンスやModuleインスタンスが定数に代入されているだけに過ぎないから 継承はC < Object モジュールにお約束はないと思うけど、リファレンスでは継承と同じように書いてるね C < Enumerable < Object
859 :
845 :2009/09/11(金) 15:50:03
>>846 レスどうも。
理解の助けになるようなサンプルがググっても見つかりません。
(手元の本のサンプルはやたら行数が多いし)
適当なサンプルコードってありますか?
860 :
857 :2009/09/11(金) 15:52:25
>>858 ありがとうございます。すっきりしました。
モジュールのインクルードもHoge::Moduleと書きたくなっちゃうけど違うんですね。
公式HP見たら、ご指摘どおり、Array < Enumerable < Object < Kernelとなってました。
Java厨の自分にはObject < Kernelはとっても違和感がw
>>859 x = 1; t = Thread.new(x){ sleep 1; p x }; x += 1; t.join #=> 2
x = 1; t = Thread.new(x){|y| sleep 1; p y }; x += 1; t.join #=> 1
こういう話?
一個目まちがえた x = 1; t = Thread.new{ sleep 1; p x }; x += 1; t.join #=> 2
>>860 公式のどこ?その書き方おかしいだろ
モジュールは何個でもincludeできるから一つの流れでObjectまで辿り着けるわけじゃないし
String < Comparable < Enumerable < Object < Kernel p String.ancestors #=> [String, Enumerable, Comparable, Object, Kernel] 矛盾してるぞ
それは知らん、書いたヤツに聞いてくれw
Comparable < Enumerableはさすがに意味不明だね。無関係のモジュール同士だし。 あまり階層を意識しないでとりあえずincludeしてるモジュールが分かればいいって程度の表記なんじゃない?
ライブラリの「ファイル名の区切り」ってハイフンとアンダースコアとキャメルケースのどれがいい? 既存のHogeというライブラリがあって、それの非公式エクステンションぽい感じなんだけど require 'hoge-ext' require 'hoge_ext' require 'hogeext' require 'hogeExt' どれになるのがそれっぽいかな
>>868 OpenURIにPOST機能をつけた場合
module OpenURIPost
require 'open-uri-post'
これがフツーだと思う
というか、require名はハイフンになるようにライブラリ作れというお達しがどっかに…
>>868 その中ならhogeextかhoge-extかな
個人的にはこっちのほうが良いと思う
require 'hoge/ext'
本家でもないのにディレクトリ切るとな いや、見栄えもいいのはわかるんだが 本家 hoge の下に foo とか bar とかあった場合ちょっと微妙に
実装上は、includeはスーパークラスと自クラスの間にダミーのクラスを 挿入してそこに指定モジュールからメソッドを追加する感じ(てきとう)。 別のモジュールのincludeではその結果出来る階層にさらに別のダミー クラスを挿入するので、内部的にはモジュール(ダミークラス)が線形に 階層を成している。 ドキュメントにそれを意識して反映してるかはシラネ。
ext という別途存在して見慣れてるディレクトリ名なのがよくない require 'hoge/plus' とかそういうのにすれば違和感が
Railsのスレが過疎ってるのでこちらで質問させてください。 ruby script/generate scaffold book title:string author:string これでbooksテーブルを作成するmigrationファイルが出来るのは分かるのですが、 NOT NULL制約やstringの長さの制限などを指定することはできないでしょうか? generate scaffoldでテーブルを作ると全てのカラムでNULL可、文字列は255文字になってしまいます。 仕方なく、作成されたmigrateファイルを修正することで対応していますが、これは正しいやり方でしょうか?
>>874 WebProg板のなら、最終投稿10日だし、別に過疎ってないと思う。
やりかたはそれでOK
全くカラム情報を与えずに作って空のmigrationに一から手で書いても
構わない。
そもそもmodelのgenerator templateの中身は
t.<%= attribute.type %> :<%= attribute.name %>
だし。
876 :
874 :2009/09/11(金) 19:37:46
任意次元の多次元配列を初期化するには、どう書くのがスマート でしょうか? たとえば size = [2, 3, 4] というサイズ指定配列を渡されたら、 a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}} と等価なことをしたいです。
Rubyには多次元配列は存在しない 単なるネストした配列だ ということで、ネストしてるだけなのでネストしてnewする a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
879 :
デフォルトの名無しさん :2009/09/11(金) 19:53:46
pdfファイルを読み込み表示させようと思って以下のコードを書いたのですがうまくいきません。 open("010.pdf", "r") do |f| f.gets end pdfファイルを読み込むには何か正しい方法があるのでしょうか。 最初はpdftotextでtextファイルに変換してから読み込もうと思ったのですが、 pdftotextを使う方法が分からなかったので直接読み込む方法を探しています。 環境はwindowsです。よろしくお願いします。
PDFファイルをテキストエディタで直接開いてみるとなんかわかるかも というかそのエディタで開くということと同じことしかしてないわけだが
Windows なら open は r ではなく rb だろ そのへんの説明はあるはずなんだが とりあえず gets ではどうにもならんと思うんで 素直に read してその pdftotext なりなんなりで解析してもらえ
>>878 > a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
それじゃダメなので質問してるんですが。
size が必ず [2, 3, 4] と指定されるのでしたら
def foo(size)
return Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
end
で OK なんでしょうけど、渡される size は [5, 4, 3, 2] だったり
[2, 3, 4, 5, 6, 7] だったりとサイズも次元も可変なのです。
本当にWindowsは糞だな。 Mac OSX最新版のSnow Loepardなら テキスト、画像、動画、PDF、MS Officeをプラグインなしで統一的に扱えるのに。
>>882 Rubyの配列に次元は存在しない
お帰りください
rubyのコレクションフレームワークって配列とハッシュしかないの?
def make_nested_array(*sizes) case sizes.size when 0 [] when 1 Array.new(sizes[0], 0) else Array.new(sizes[0]){ make_nested_array(*sizes[1..-1]) } end end
>>885 Stack、ListはArrayで間に合うだろう。
Queueは、優先度が付かないならArrayを使え。
このへんは大クラス主義。
標準では、他にSetが付いてくるが、組み込みではないので要require。
Treeは標準にはない。
>>886 なるほど。
*size を size に替えてうまく動きました。
ありがとうございました!
890 :
デフォルトの名無しさん :2009/09/11(金) 21:17:37
>>880 テキストエディタで開くと文字化け?してしまいます。
>>881 pdftotext.exeは実行ファイルなのですが、Rubyのスクリプトから使用する方法が分かりません。
何度も申し訳ないのですが、教えて頂けないでしょうか。。
`pdftotext hoge.pdf`?
>>889 横からだけど
make_nested_array([2, 3, 4])
よりは
make_nested_array(2, 3, 4)
のほうが素直というかRuby的だと思う
ary = [2, 3, 4]
で渡された時のことを考えているんだろうけど
make_nested_array(*ary)
とやれば引数を展開できる
>>890 pdftotext.exeは知らないけど、コンソールでできることなら大抵system関数でできる
コマンドラインを関数に渡せばいい
893 :
デフォルトの名無しさん :2009/09/11(金) 21:53:15
system関数でできました。本当にありがとうございました!
rubyでpdfを作るにはどうすればいいですか?
>>894 ruby pdfでググると色々出てくるので好きに選べばいいじゃない
>>894 ぶっちゃけ、基本ただのテキストファイル。仕様どおりに作ればいい。
適当に一部分だけgzipかけてみたりフォント埋め込んでみたり暗号化してみたり
してる部分もあるが、それは全部付加的なものだし。
現実的には、
>>895 。RubyならHaruでいいんじゃね?
RubyでPDFをgrepできたら便利だな 簡単にできるのならやってみようかな
PDFを読んでるわけじゃないぞ PDFをプレーンテキストにする外部プログラムにファイルを渡して 標準入力から受け取って文字列にしてるだけ
中括弧 { } を付けても付けなくても同じ結果になるのですが、これらに違いはあるのでしょうか? def hoge arg p arg end hoge( :a => 1, :b => 2 ) #=> {:a=>1, :b=>2} hoge( {:a => 1, :b => 2} ) #=> {:a=>1, :b=>2}
>>900 の場合は同じ意味。
{}はHashを意味している。
メソッド引数の最後のものがHashである場合に限り、{}を省いてよい。
rubyとpythonはどっちが強いですか?
ruby
たしかにruby厨はpython厨よりしつこいな
実行速度 書きやすさ 読みやすさ インストールのしやすさ ライブラリの使い勝手 リファクタリングの効率 配布 どれをとっても(ry
議論してもどうせ荒れる方向にしか行かないんだから初心者スレでこうゆうネタ出すの止めて
どうせたいていは釣りなんだからボケの腕の見せ所かと
rubyスレはこういうときにもボケで返すセンスのある香具師が多いが pythonスレではまじめにレスするかスルーされるケースが多い よってruby埼京
2chってどこ行ってもごみレスつけるおっさんばっかりになってるな そんなに寂しいのか彼らは
913 :
デフォルトの名無しさん :2009/09/13(日) 12:39:10
すいません質問させてください (@@connections ||= []) << self 上記のコードの @@がクラス変数, << が配列への要素の追記ということはわかったのですが ||= の記号の意味がうまく調べられませんでした どなたか教えていただけないでしょうか?
@@connections = @@connections || []
>>913 ||=は左辺がnil、falseでないときは何もしない
もしnil、falseなら右辺を代入する。
>>913 foo ||= []
は
foo = [] unless foo
とおなじ。
(foo ||= []) << "aaa"
は
foo = [] unless foo
foo << "aaa"
とだいたい同じ。
foo = [] unless defined?(foo) じゃないと動作しないだろ、というツッコミは これはこれで面倒な話でありましてですな
まあ、 irb> (p "ok") if foo NameError: undefined local variable or method `foo' for main :Object from (irb):1 from :0 がエラーで irb> (foo = "ok") if foo nil が OK というのは不条理っちゃ不条理ではある ちなみに (foo = "ok") if foo のあと、 foo は nil を返す
へえ!そんな違いあるのか 初めて知った どういう基準で分かれてるんだろう?
>>920 FAQ にもあるんだが、ローカル変数は、構文解析で代入が見つかるかどうかだけが鍵
実際に(いつ)実行されるかどうかは関係がない
if false
foo = "OK"
end
foo
上記は NameError を起こさないが、以下は foo が NameError を起こす
for e in [1, 2 ,3]
if e == 2 then
foo
else
foo = "OK"
end
end
動作は同一なはずの unless で 代入記述の順番を変えると NameError は起こらない
for 構造はスコープを作らないことに注意
for e in [1, 2 ,3]
unless e == 2 then
foo = "OK"
else
foo
end
end
これ、実際改良する気ないのかな。Rubyの実装もいろいろ出てきてるんだし。 気持ち悪くないのかな。それとも、別に実装の都合ではなくてポリシーなのか?
もともとそういうポリシー。
ブロックでスコープをわけないようにするという話もあったりするので、
遠い未来の2.0あたりでは
>>921 の例も動くようになるかも。
スタックに積まれるローカル変数は明示的に初期化すべしってのはrubyに限ったことじゃない。
926 :
913 :2009/09/13(日) 16:46:38
>>914-919 ご丁寧にありがとうございます。
ソース読んでいてここだけわからなくて困っていたのですが助かりました。
>>925 if ARGV
opt1 = ...
end
opt1_runner(opt1) if defined?(opt1)
これが期待通り動作しないということなんだぜ
たかがローカル変数で
opt1 = nil
if ARGV
opt1 = ...
end
opt1_runner(opt1) if opt1
とか書かなければならないのは流石にバカっぽい
バカっぽいか?すごく素直な書き方でいいと思うけど。
Rubyのifはスコープを作らないだろ いわんとすることはわかるが
そんな小さな労力のために仕様変更してたらぐちゃぐちゃになるわ。 ローカル変数を初期化不要にしてしまうと、フィールド変数を参照してるつもりでスペルミスしてもエラーにならなくなる。 あらゆる場所で意図しないローカル変数が勝手に生成される可能性があるわけで何とも気持ち悪い。 フィールドはオブジェクトの属性という意味合いから初期値があるのは自然だけど、 ローカル変数はちょっと値を保存しておく場所って意味合いしかないから、ソースコードを簡略化するために初期値を設けるってのも設計上美しくない
931 :
デフォルトの名無しさん :2009/09/13(日) 17:37:53
質問です 下記のように@flagを判別して @flagがtrueの場合, testのputs "test"が実行され @flagがnilの場合,testを中断させputsは実行されない という処理を書きたいのですが可能でしょうか? flag_ok?でfalseを返してもいいのですが、 test2,test3と他にも最初にフラグをチェックして@flagがnilの場合、処理を中断したいメソッドが複数あるので、シンプルに書く方法を模索してます @flag = nil def test flag_ok? puts "test" end def test2 flag_ok? puts "test2" end def flag_ok? if @flag return true else return "testの実行を中断させるなにか" end end
@flag = nil def test return if @flag puts "test" end def test2 return if @flag puts "test2" end これじゃなんかダメなん
934 :
931 :2009/09/13(日) 19:08:11
>>932 ありがとうございます参考に直してみました。
ちょっとエラー時に処理をいれたかったのと
うまいこと1行で書きたかったのですが
すっかり if,unlessのこの書き方を失念してました
@flag = nil
def test
return unless flag_ok?
puts "test"
end
def flag_ok?
if @flag
return true
else
puts "処理"
return false
end
end
フィールド変数って何?
>>935 @hoge = 1234
の@hogeのこと。
Rubyだとインスタンス変数かな?
フィールド変数はJava用語だったかも?Delphiでも聞いたな。
C++だとメンバ変数だっけか。
>>935 Rubyで言うインスタンス変数
逆か、他の言語で言うフィールド変数はRubyではインスタンス変数で扱う
Smalltalk流だな、インスタンス変数という呼び名は。
フィールド=インスタンス変数 じゃないぞ フィールド=メンバ変数=インスタンス変数&クラス変数 が正しい
普通にネストしてるクラス定義があります class A class B class C end; end; end A B C を模したモジュール M があります module M module A; def hoge; end module B; def hoge; end module C; def hoge; end end; end; end; end で、M を適度に include して A.new.hoge も B.new.hoge も C.new.hoge も有効にしたいんですが、 次のような書き方しかできないような気がします class A; include M::A class B; include M::A::B class C; include M::A::B::C end; end; end なんというかこー、せっかく模したので「一発」でできるようにしたいのですが、なんかうまい方法ないですか
include M しただけで A::B::C.new.hoge が有効にならないのはなんでとかそういう質問?
>>940
標準機能にはないし、ライブラリもなさそうだから、自分でつくるしかないかなあ。
def get_module_object(name)
mod = Object
name.split(/::/).each do |s|
mod = mod.const_get(s) or raise NameError.new("#{name}: not found.")
end
return mod
end
get_module_object('M::A::B::C')
def include_recursively(klass, namespace)
mod = get_module_object("#{namespace.name}::#{klass.name}")
klass.class_eval { include(mod) } if mod
for name in klass.constants
c = klass.const_get(name)
include_recursively(c, namespace) if c.is_a?(Class)
end
nil
end
include_recursively(A, M::A)
p A.ancestors #=> M::A が含まれている
p A::B.ancestors #=> M::A::B が含まれている
p A::B::C.ancestors #=> M::A::B::C が含まれている
実行効率はあんまりよくないけど許して。
943 :
デフォルトの名無しさん :2009/09/15(火) 01:18:30
StringIOを読むときってrewind必須? 昔のテープメディアみたいでなんかヤなんだけど
>>944 IO自体がテープメディアみたいなもんなんだけどw
to_s で最初から最後までが文字列として返ってこなかったっけか 同名モジュールの include で疑問があったことを思い出した module A def hoge; B.new; end end module B; end class A; include A; end classB; include B; end これで、A.hoge すると モジュール B の new メソッド(無論ない)を呼ぼうとするんだよ 全く以って書いてある通りに動いてるだけなんでございまするが、 module A を作る時点で、include 先から見た B クラスを使うように指定することはできんもんかね
>>946 できない…と思う
include したらたまたま同名の自作クラス B があったためにモジュールが動作しませんとかモジュールの意味ねえよ
モジュール内部で呼ぶ B はモジュールが定義されたときに(モジュール内部に)存在する B だ
:: で始まる「フルパス」で書くしかないな
include されるクラス名が不定なのならお隣クラス B を呼ぶことはそもそもできないので諦めるべし
>>946 module A
def hoge ; self.class.const_get(:B).new ; end
:
949 :
デフォルトの名無しさん :2009/09/15(火) 11:17:23
コード中で、あるライブラリがrequireされているかどうか判断することはできますか? 擬似コードですが、こんな感じで書けたらと思ってます if nkfがrequireされていたら; ・・・ elsif uconvがrequireされていたら; ・・・; end 現在はbeginブロックに入れてNameErrorで判断しています
>>949 そのライブラリが何か定義するなら
defined? NKF
とか。
あと、$LOADED_FEATURES ($") というグローバル変数もあるが、
ファイル名べったり依存になるのであまり推奨したくないな。
require自体がファイル単位を扱うメソッドなんだからファイル名依存になるのは当たり前だろ
952 :
949 :2009/09/15(火) 12:17:34
>>950 ありがとうございます!どちらも気づきませんでした・・・
プログラムを書き換えてみての動作確認もうまくいきました。
>>951 requireされてるかわからないということは自分以外がrequireしたってことだから
ファイル名を知らないし知る必要もないと思う
require 'lib/example'
require './lib/example'
$LOAD_PATH << "lib/"
require 'example'
とりあえず実際問題として、$"ではこれらが区別されるから(requireも二重ロードをする)
>>950 のようなduck type的アプローチのほうがよいかと
Rubyでよく言うダックタイピングってJavaなんかで言うポリモーフィズムのことですか? 実装の違いは別として機能的には。
アドホック
>>954 だいたい合ってる
あえて区別するなら、ポリモーフィズムはクラスC1とC2に何かしらの関係性が産まれる
(スーパークラスが同じとか、インターフェイス/モジュールに同じモノを使うとか)
ダックタイプはメソッドに応答するだけでいい
「共通であるから同じに扱う」と「同じに扱えたから共通だと見なす」という感じ
・・・とは言ったものの、ポリモーフィズム自体にそういう定義はないと思う たぶん、関係性が産まれている場面でばかり使われていたから 関係性がないことを強調した言葉として派生させたのがダックタイプなんじゃないかな
>>953 あと、require だと拡張子が省けるが、$" の中には拡張子込みで
入るので、実装を気にする必要も出てくる。
拡張子込みとは言っても ".rb" か ".so" のどちらかじゃない?
Macだと nkf.bundle になってたりする。
>>961 それだと A::B と解釈されるからダメ
>>960 えーそれってMRI(YARV)? それともRubyCocoaとか?
そもそも
>>946 の設定からしてわかりにくいんだよな、定数かぶりまくってるし
module M
module A; end
module B; end
end
class C
class A; include M::A; end
class B; end
end
こういうことなんだろうか
つーかこの状況だとModule.nesting使えないのか・・・
泥臭い方法以外でC::AのインスタンスからCを得る方法ってあるの?
>>963 $ uname -a
Darwin aries.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386 i386 iMac9,1 Darwin
$/usr/bin/ruby -v -rnkf -e 'p $"'
ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]
["nkf.bundle"]
こっちも一応。 $ /usr/local/bin/ruby -v -e 'p $"' ruby 1.9.2dev (2009-09-08 trunk 24795) [i386-darwin9.8.0] ["enumerator.so", "/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/encdb.bundle", "/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/trans/transdb.bundle", "/usr/local/lib/ruby/1.9.1/rubygems.rb" ] -rnkfすると enc/euc_jp.bundle とか混ざって長くなるので省いた。
>>963 基本的にシステム固有のsuffixが使われる。
例外は、ライブラリにlibなどのprefixをつける慣習がないWindows等DOSISH系。
たとえば、libiconvのiconv.dllと拡張ライブラリのiconv.dllが区別つかなく
なるという事態を避けるため、後者を.soにしている。
>>966 なんで enumerator.bundle じゃないんだろう。
requireをロックするため突っ込んである 実際に探索したわけでもないパスだから。
ume
どうしてルビーなの? なんでpythonじゃなくてルビーなの? 開発者が日本人だから?愛国心ってやつ?ねえ?
あなたがPerlでもPHPでもSchemeでもなくPythonを使っているのと同じようなレベルの理由です
>>971 煽りに使えそうな反論が出たらpythonスレに張り付けに行くんだろ?
yes i do
class C def initialize hoge hoge = Array.new hoge end def hoge puts "参照メソッド呼ばれましたん" end def hoge=(arg) puts "代入メソッド呼ばれましたん" @hoge=arg end end C.new これはやっぱり 参照メソッド呼ばれましたん 代入メソッド呼ばれましたん 参照メソッド呼ばれましたん であるべきなんじゃないかと思う今日この頃 っていうかこのへんの動作に依存したスクリプト作るのやめれ紛らわしいわぼけーうおー
Pythonスレから刺客が来たと聞いて
ローカル変数代入だけはちょっと特別なんだよね 代入の形したメソッドがある場合はどっち使うのか注意
識別名がまずローカル変数、でなければインスタンスメソッドと 決定されるのは自然な発想では ただ確かに紛らわしいから、結局 >このへんの動作に依存したスクリプト作るのやめれ じゃなかろうか
間違ってる人がいそうだから注釈するが、
>>975 は代入メソッド1回も呼ばれてないぞ
hoge= というインスタンスメソッドがあっても、hoge=Array.new はローカル変数への代入だ
= つきのインスタンスメソッドを呼びたい場合はレシーバが必須になる
この場合は self をつけて self.hoge=Array.new だな
これに def hoge; @hogeを処理して返す; end が加わってると混迷を増す
ローカル変数の方がメソッドよりスコープ狭いんだから、ローカル変数が最優先で名前解決されるのは当然のように思える。
>>978 呼び出しはそれでいいんだけど、
>>977 も言うようにキモは代入でしょ
ローカル変数とインスタンスメソッドに同じ名前さえ付けなければ
この手の問題は起きないと思ってる人はわりといるはず、つーか俺
>>980 存在するローカル変数と存在するインスタンスメソッドなら同意
まだ存在しないローカル変数と存在するインスタンスメソッドだったら、存在する方が優先に思える
「代入もメソッド呼び出しである」と考えると
変数hogeがないときにself.hogeが呼ばれる動作と対称的ではないのが違和感の原因
「疑わしきはローカル変数と見なす」も理解はできるけどね
まあ世の中にはいろんなバックボーンを持った人がいるから、Rubyのルールが気持ち悪い/気にくわない/落ち着かないという人も大勢いるだろう。 それは仕方ない。そういうもんです、慣れてくださいとお願いするしかない。 ただまあ、代入に関して言えば、 ・foo = 123 は変数への代入 ・obj.foo = 123 は setter メソッドの呼び出し というルールが分かっていれば、そう混乱することはないように思う。 問題は、それを明確に教えていない本やドキュメントのほう。
問題は hoge というインスタンスメソッドが定義されているとき、 hoge(123) とすると hoge メソッドに 123 が渡される hoge! というインスタンスメソッドが定義されているとき、 hoge!(123) とすると hoge! メソッドに 123 が渡される hoge? というインスタンスメソッドが定義されているとき、 hoge?(123) とすると hoge? メソッドに 123 が渡される [] というインスタンスメソッドが定義されているとき、 [](123) とすると [] メソッドに 123 が渡される []= というインスタンスメソッドが定義されているとき、 []=(123) とすると []= メソッドに 123 が渡される とここまで来ておきながら hoge= というインスタンスメソッドが定義されているとき、 hoge=(123) とするとローカル変数 hoge に 123 が代入される になること
着眼点はおもしろいな。 ただ、それは ・代入のほうが優先される というルールで簡単に説明できるんじゃね? これなら十分わかりやすい。
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました
hoge= が hoge = と書いても動作するのが原因のひとつのような気がしてきた
クラス変数が@@var インスタンス変数が@var なんだから ローカル変数にも命名規約を作ればよかっただけ #varとか 設計者の脳みそが足りなかった
つまり認識の順番が逆なんだよ ・ obj.hoge = や obj.hoge= とあったとき、それは必ず obj のメソッド hoge=() である ・ hoge = や hoge= とあったとき、それは必ず変数 hoge への代入である ・ 末尾に = がついたメソッドはいわゆる関数形式では呼べないので諦めろ こう覚える
ルールの一貫性なんかより普段書いてて使いやすいかのほうが重要
冗長な接頭辞なんかいらんつーの
>>989 ふだん書いてて使いやすいように、一貫したルールが必要なんだろ
マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ
> マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ Perl の $ と @ が脳裏をよぎったw
ruby厨無理スンナ
>>982 や988で十分わかりやすいと思うけどな。
アンチさんたちは何が不満なのかな。
これどっちなんだっけ、と迷うようなコードは書かないのが定石だろうに
今更そんな当たり前のこと言われても
雑魚乙ということで埋め
雑魚乙ということで埋め
雑魚乙ということで埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。