1 名前:1様 [2009/04/02(木) 09:42:23 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】 【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】 ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です ※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
735 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 07:14:15 ] >>732 おいおいスクリプト言語ぜいが全然周りと違ってて吹いた。 下手するとハマるね、これは。 こういうのって何かで規定されてないのかね…。 AA化してみた 負の剰余 C Java PHP Emacs Ruby Python Perl (GCC (Sun JDK 4.3.10 22.0.50.2 1.8.2 2.3.5 5.8.4 3.3.5) 1.5.0_05) -16 -3 % 5 -3 -3 -3 -3 2 2 2 . 3 % -5 3 3 3 3 -2 -2 -2 -3 % -5 -3 -3 -3 -3 -3 -3 -3 こんなプログラムはいやだ: 負の剰余 - bkブログ 0xcc.net/blog/archives/000083.html
736 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:03:39 ] 個人的にはスクリプト言語勢の振る舞いがしっくり来るなあ。 しかし数学的な定義はないのか?ありそうだが。
737 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:16:14 ] 定義されてるよ。 「 A mod B は "AをBで割った余り"」だから「B と商 x をかけて剰余を足すと A に戻る」でいいよな? -3 mod 5 = -3 だとする場合 (C言語) 5 と 商 0 をかけて剰余 -3 を足すと 5 * 0 + (-3) = -3 に戻る…正解 -3 mod 5 = 2 だとする場合 (スクリプト言語) 5 と 商 -1 をかけて剰余 2 を足すと 5 * (-1) + 2 = -3 に戻る…正解 ということで、そもそも2通りあるから、「どっちでもいい」。 手計算の世界では「剰余は商より小さい正の整数」という条件がついてたりするんだけど (「10割る3」は「商3余り1」であるべきで、「商4余り-2」ではないと習ったはず) C言語は「割られる数が負なら絶対値で計算して結果を負に変換する」という流儀に従ってる。 まあ、剰余に関しては言語のマニュアル必ず読めって感じだな。
738 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:41:01 ] CやC++なんかの仕様では 「割る数と割られる数の両方が正である場合は商と剰余は必ず正であるが、 少なくともどちらかが負である場合は定義しないので処理系が得意なように作れ」 とかヤな感じに丸投げなことが書いてあったはず
739 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:50:02 ] >>738 CやC++の場合は、コンパイラが、「俺は知ったこっちゃねぇ。CPUに任せる」という コード生成ができるという利点がある。
740 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:57:32 ] ってことは正確を期したいならどんな言語使うにせよ 正負の確認処理を挟むべきってことか
741 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:00:49 ] 負の除算は意図をもって行われるべきだってことだね まあ、コンピュータにおける除算自体がそもそも日常視点では怪しさのカタマリだから慎重になるべきなんだけどさ
742 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:02:23 ] >>740 確認したってどうせ一つしか結果は出てこないんだから、 それなら最初から自分で関数組んだ方がw
743 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:09:01 ] 一般的用途においては割る数と割られる数の両方を事前に絶対値とって使うべきかね 剰余を使う機会で負になるのはたいてい割られる数だし
744 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:26:39 ] >>723 hpcgi2.nifty.com/sakazuki/forum/wwwforum.cgi?id=1&az=thread&number=250 自分の場合、ここを参考にver1.0.1をインストールした後にver1.1.1を上書きインストールしたら エラーが出なくなった。
745 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 10:09:29 ] >>744 ありがと! 足りないファイルを1.0.1からコピーしたらエラーでなくなったよ
746 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 10:23:58 ] >>735 >>736 数学的にどうこうってのは737の書いたとおりで en.wikipedia.org/wiki/Modulo_operation に、いろんなプログラミング言語でどっちなのかまとめている表があるよ。 両方持ってる奴もあるんだなw
747 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 17:37:44 ] rspec 使って遊んでます 「大量のファイルやら外部参照やらがあり、きちんと動作することが現状 おおむねわかりきってるひとまとまりの部分のテスト」 が 「今テストしたい部分を繰り返しテストして試す」 という行為にちょっとジャマ(処理に時間かかるし、ファイルアクセスがなんとなく無駄)です if false # 終わったので一旦スルー … end で囲うというのも考えたんですが、なんかこうスマートな考え方はないもんでしょうか?
748 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:02:36 ] >>747 つ pending 外部と接続する部分は、mockがうまく利用できる形に持っていくのもよい。
749 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:38:14 ] >>747 スペックファイルを分割すればいいのでは?
750 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:44:56 ] ネットからファイルを取得する処理のあるスクリプトなんかは困るよね specコマンド連打するたびにGETが大量に起こったり
751 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:25:25 ] そんなの、specファイルの中でメソッド再定義すればいいじゃん サーバへアクセスしてる部分を事前に保存しておいたローカルのファイルを読むように書き換えればいい
752 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:32:53 ] specファイルの中でオリジナル書き換えたらオリジナルのテストになんねえよ
753 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:35:55 ] なんという正論
754 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:39:41 ] >>752 そのメソッドをテストするときだけオリジナルの動作になれば問題ないだろ html = $TEST_HOGE ? File.read("local.html") : open(uri).read
755 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:43:27 ] 「実際にネットワークからモノを取ってくるオブジェクトX」自体 のテストではネットワークを使わざるをえないが、それのテストが 十分出来ているなら、Xの利用者をテストする際には、Xはmockで 代用できる。
756 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:50:49 ] >>754 実質的な動作は同じだしな テストできないで終わるよりずっとマシ
757 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:12:53 ] >>754 だからこうするんだってば def get(uri) return uri.read end ↓ def get(uri) return File.read('local.html') end
758 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:21:04 ] >>757 微妙・・・ テスト内の複合バグとかさくさく作り込みそうに見える。 元のコードがみんなシンプルなものならいいかもしれないけど。 mockとかstubってのはそういう書き換えをしなくていいためにあるんじゃないの? ttp://www.ibm.com/developerworks/jp/web/library/wa-mockrails/ とか ttp://d.hatena.ne.jp/takihiro/20081023/1224762895 とか読んでも全く使い方はわからんかったが
759 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:27:58 ] コストのかかる部分を全部メソッドとして吐き出せるようにクラスを作る そうすればその部分のメソッド定義を書き換えるだけでテストが書きやすい
760 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:30:49 ] インスタンス変数をメソッド内で利用するとテストで条件変えたときに書き換えられないから、 全部引数で渡すようにするのがポイント
761 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:33:50 ] RSpecのテストに対応させてスクリプトを作ると諸記述が2ランクくらい退化するというのはよくある 巷のRSpecの解説は一番大事なことをあえてすっ飛ばしてると思うんだ
762 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:35:00 ] >>759 なるほど >>760 こっちは・・・どうなんだろう。 いずれにせよ、テストしやすい書き方も大事ってことか。
763 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:39:02 ] >>761 describe と before と it と should と eql しか使わせる気がなさそうな説明はいくつか… これしか使わなくてもテストは書けるのでタチが悪い これ以上のことを説明する気がないのならむしろRSpecを使わせないほうが効率も能率も高い
764 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:41:20 ] >>763 なにそのるびま
765 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:11:43 ] rspec といえば、あれって「○○と表示されること」をテストするのってどうするん?
766 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:40:48 ] >>764 素晴らしい先駆者であるがゆえに失速の影響が… えー、「内部の○○メソッドを今は動作したことにしたい」というカジュアルな用途には、stub! が使えると思われ require 'spec'; require 'open-uri' class Hoge def get(uri); open(uri).read; end def pick_title(uri); get(uri).scan(/<title>(.+?)<\/title>/).to_s; end def main pick_title('www.example.com/ ') end end # ----------------------- describe Hoge do before :all do @hoge = Hoge.new end describe "#main: サーバからHTMLを取得してタイトルを表示する" do it "たいとる!" do @hoge.stub!(:get).and_return('<html><title>たいとる!</title></html>') @hoge.main.should eql('たいとる!') end end end 「@hoge の get メソッドが呼ばれたときは処理を横取りして and_return の引数を代わりに返すようにする」という記述 あんま小難しいこと考えなくていいのでとっても便利
767 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 22:23:06 ] …これはこれで stub! ばかりになりそうw
768 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 03:40:20 ] rspecにはTest::Unitの-nオプションみたいにテストを限定する方法はないの?
769 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 05:45:40 ] >>750 つ FakeWeb 外部URLを偽装するテスト用ライブラリ「FakeWeb」 doruby.kbmj.com/x5r_on_rails/20090427/_URL_FakeWeb_1 MOONGIFT: ≫ Web API/Mashup開発者に必須!オフラインでも外部アクセスをテストできる「FakeWeb」:オープンソースを毎日紹介 www.moongift.jp/2009/04/fakeweb/ まあ、こういうのをスタブ?っちゅーらしいが
770 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 00:15:40 ] str = String.new p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 #ふー。。。
771 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:35:21 ] require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h} これを実行すると /usr/lib/ruby/1.8/pstore.rb:349:in `dump': can't dump hash with default proc (TypeError) と言われます。 既存のハッシュを「無難な」ハッシュに変換してそれをまた戻す方法とかないもんでしょうか
772 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:46:17 ] うわー それじゃデフォルト値つきの配列やハッシュって駄目じゃん 普通の配列やハッシュのつもりで誰がMarshalするかわからないんだし怖くて使えん
773 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:48:31 ] hh = Hash[h] ではどう?
774 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:51:42 ] >>772 Proc つきのまま外に出すなってことなんだと思う デフォルト値つきのハッシュはデータ製作用の仮形態のみにしておく require 'pstore' def makedata h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' return Hash.new.merge(h) end h = makedata PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h} これなら動作する 開発者側が気を遣えってことなんだろうな 既存の誰かが作った(そしてどこに初期値つきハッシュが使われてるのかよくわからん)データを マーシャル可能な形態に変換する方法は知らん
775 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:01:39 ] >>771 いっそのことYAMLにしてしまうとか require 'pp' require 'yaml' #h = {0 => Array.new} h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'A' << 'B' << 'C' h["mage"] << '100' << 1234.56 << :hage pp h puts y = h.to_yaml puts y puts new_h = YAML.load(y) pp new_h pp h == new_h
776 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:05:25 ] わざわざ PStore するってことはオブジェクトとして一時保管したいのだろう YAML ではどうにもならん気もする
777 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:06:03 ] では、yaml/storeで #!ruby -Ku $KCODE='u' require 'pp' require 'yaml/store' #require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' YAML::Store.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}
778 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:06:48 ] あああ、てか、procごと保存して復元したいってことなのか?PStoreってそこまで対応しとるノン?
779 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:11:50 ] Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore jp.rubyist.net/magazine/?0016-BundledLibraries > IO や Proc などの Marshal.dump が出来ないオブジェクトは保存することが出来ませんが、 > Marshal.dump 出来るオブジェクトなら何でも保存できて、Marshal.load 出来るものは何でも読み込めます。 駄目なんすね・・・まあ普通考えたらそうか procで詰まるってことは、後でevalれるコードを格納できるように、 って難しく考えないで、1個1個個別対処しかないんじゃないのかなあ。 復元時にprocを戻すようにというか、Hash.new{|h, k| h[k] = Array.new} 生成して再代入と言うか
780 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:19:55 ] 一応>>774 が答ではあるのだろう 出しっぱなしにならないようにクラス製作者に気をつけてもらうしかなさそうだ デフォルト値の動作が重要な代入可能な配列なんかを提供する場合は Procつき配列をそのまま出すのではなくそういうデフォルト動作をするメソッドを自力で作れと
781 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:22:55 ] めんどいな
782 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 15:34:57 ] class MyHash < Hash def initialize(*args) super {|h, k| h[k] = []} end def marshal_dump Hash.new.update(self) end def marshal_load(data) update(data) end end
783 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 17:43:17 ] マニュアルのとこにちょろっと書いておいてくれるとよかったのにね 「ただし、ブロックは Proc なのでこのままではオブジェクトを Marshal することができません。Hash#merge して下さい」とか
784 名前:753 mailto:sage [2009/05/08(金) 17:49:20 ] >>728 同じ事を考えたんだけどmarshal_loadしたオブジェクトは initializeされてないからdefault_procが再設定されてないのよ h = MyHash.new h[0] << 'a' << 'b' << 'c' h = Marshal.load(Marshal.dump(h)) h[1] << 'a' << 'b' << 'c' #=> undefined method `<<' for nil:NilClass (NoMethodError) initialize以外でdefault_procは設定出来ないしどうしたもんかね
785 名前:784 mailto:sage [2009/05/08(金) 17:51:39 ] 名前欄は無視してくだしあ
786 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 19:52:10 ] >>770 >p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 これって fusiあな、、?
787 名前:デフォルトの名無しさん [2009/05/08(金) 20:39:17 ] TSUKARETA
788 名前:デフォルトの名無しさん [2009/05/08(金) 20:39:48 ] $ irb1.8 irb(main):001:0> str = String.new => "" irb(main):002:0> p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 "TUKARETA" => nil irb(main):003:0>
789 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 21:21:55 ] String.new << e は、e.to_s した結果を末尾に追加するべきだと思う
790 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 21:26:18 ] まあ ASCII コードの取り扱いのへんはいろいろシガラミがあってだな
791 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 23:26:20 ] Rubyユーザとは思えない>>772 のレスのせいで初心者が混乱しかねないので、 一応言っとく。 ○デフォルト値はあってもMarshalできる(もちろんpstoreも) h = Hash.new(1) h = Marshal.load(Marshal.dump(h)) p h[:foo] #=> 1 ○ダメなのはdefault_proc h = Hash.new {} Marshal.dump(h) #=> can't dump hash with default proc (TypeError) ○default_procはHash#default=で消せる h = Hash.new {} h.default = nil h = Marshal.load(Marshal.dump(h)) p h #=> {} ○配列にデフォルト値などない a = [] a.default = 1 #=> undefined method `default=' for []:Array (NoMethodError)
792 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 23:31:13 ] >>784 Hash#default_proc=
793 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 01:38:12 ] >>792 このスレでは1.9をデフォと思わないほうがいい。
794 名前:784 mailto:sage [2009/05/09(土) 01:46:48 ] >>792 1.8.7だと undefined method になっちゃう(1.8.8とかで取り込んで欲しいな) てかinitialize呼んじゃってもいいのね def marshal_load(data) update(data) initialize {|h,k| h[k] = Array.new } end # あとアンカも間違えてた ×>>728 ○>>782
795 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 02:43:48 ] asobi.sqweebs.com/learn/1.php Rubyではこんなの、作れないっしょ!
796 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 05:34:28 ] てか、自分でクラス作ってるならこんな面倒なことしなくても 「該当部分の見当つくんだから空のハッシュとマージさせとけ今からやれ」で終了なわけで ソース読むのめんどいくらいの他人様のライブラリを仮定してると思われる以上 そこで「1.9ならできる」というのはいささか的外れな気もする
797 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 07:48:41 ] >>791 こういうのまとめたwikiが欲しいな… RubyのFAQ用のwikiみたいなのってなかったけ?
798 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 08:40:47 ] >>797 マニュアル嫁
799 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 08:43:37 ] >>797 WikiのURLがいつのまにかテンプレから外されてるな どっちも更新少ないから無理もないが ■ちょっと前にできたWiki Ruby 初心者スレッド Hiki starlet.s145.xrea.com/ruby/hiki/ Ruby Portal ruby.morphball.net/portal/
800 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 09:19:06 ] >>791 Ruby 初心者スレッド Hiki - PStore、Marshal関係 starlet.s145.xrea.com/ruby/hiki/index.cgi?PStore 転記しておいた
801 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 09:59:13 ] 質問です オブジェクトが、あるモジュールに含まれるクラス群のインスタンスであるかどうかを 調べる簡単な方法はありますか? 現在、 obj.class.to_s =~ /MyModule/ みたいな判定の仕方をしているのですが、こういうことに正規表現マッチを 使うのも大げさな気がします。もっと簡潔なやり方はないでしょうか。
802 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 10:15:23 ] obj.is_a?(MyModule) で用が済まなくなったらまた来てくれ
803 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 10:30:33 ] >>802 済まないと思う obj = MyModule::KlassA::Sub.new obj = MyModule::KlassB::Sub.new という可能性があるときにたとえば if class_include_klassA(obj) then # obj が MyModule::KlassA::Sub だと期待した処理 elsif class_include_klassB(obj) then # obj が MyModule::KlassB::Sub だと期待した処理 ... というようにしたいのだろう そうすること自体がなんか方向性間違ってるような気もするが
804 名前:801 mailto:sage [2009/05/09(土) 10:52:24 ] >>802 すいません。言葉足らずでした。 MyModule はトップレベルに include されているため、コアクラスもみな is_a? に対し true を返すという状況です。
805 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 10:55:06 ] ん?
806 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 11:05:52 ] >>801 あるモジュールに含まれるクラスのサブクラスのインスタンスの時はどうするの? module Mymod class A # あるモジュールに含まれるクラスのインスタンスか調べるメソッド(仮) def nesting?(mod) ; self.class.name =~ /#{mod}/ ; end # その一 def nesting?(mod) ; Class.nesting.include?(mod) ; end # その二 end end class B < Mymod::A ; end Mymod::A.new.nesting?(Mymod) #=> 0(true)/true B.new.nesting?(Mymod) #=> false/true
807 名前:801 mailto:sage [2009/05/09(土) 11:36:19 ] 皆さんレスありがとうございます。 インターフェースを揃えてそもそも処理を分けないで済む方法で自己解決しました。 お騒がせしました。 >>806 モジュールの外で継承されることが完全に抜け落ちてました(汗) 自分がやりたかったのは Class.nesting を使ってる方です。 勉強になりました。ありがとうございます。
808 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:27:32 ] 質問 my/main.rb my/mod.rb というディレクトリ構成で、main.rb に require 'mod' と書いてあるとします これ、カレントディレクトリがたとえば HOME だったりすると $LOAD_PATH の "." が HOME になって HOME/mod.rb を探してしまって希望通りに動作しませんよね 「自分が存在するディレクトリにある自分用ファイルを require する」ということをさせたい場合の 決まった書き方はありますか?
809 名前:デフォルトの名無しさん [2009/05/09(土) 15:28:32 ] require fine.join(__FILE__, $0)
810 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:34:30 ] >>808 どうするのが定石が知らんが、gemsとかのspecファイルとか見てると、 $:.unshift(File.dirname(__FILE__)) してから、require するか、 require File.join(File.dirname(__FILE__), 'spec_helper.rb') という感じだな。
811 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:37:35 ] >>808 わかりやすいとこで #!/usr/local/bin/ruby -Ku $LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__))) require 'mod' ... require は引数をフルパスにしても動作保証がなかったはずだし Ruby のめんどくさいとこだな
812 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:42:21 ] そうそう、ファイルを2つに分けただけなのに $LOAD_PATH とかいじらないと動作しないというのはどうにも カレントディレクトリをデフォで追加しようとか考えた奴はお花畑だと思う
813 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:45:13 ] …そこまで言わんでも 1.9 でこっそり追加されてるとかそういうことはないかしら
814 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:55:39 ] まあ、めんどっちいな 何が面倒かっていうと cron とかそういう絶対パスで動作させるような環境にたまたま持っていったときに その cron の内部でだけよくわからんエラーになって露見するのが嫌 「っかしーなー動くよなー mod.rb もあるしなー」と(当該ディレクトリ内で相対パスで)スクリプト動かして首捻るわけだ
815 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 18:03:59 ] rubyに限ったことじゃないような。 Windowsのソフトでも作業ディレクトリ(カレントディレクトリ)をexeと同じにしないと、 まともに動かないのはザラだからな。 何がいいたいかというと、カレントディレクトリ依存とかはプログラマの仕事でもあり、 そうじゃなかったらユーザーが気を配る話でもある。 (Windowsはショートカットだとカレントディレクトリは最初自動で設定してくれるが、 バッチ処理とか、コマンドラインから起動したりするととたんに>>814 みたいなことになるんだよな) まあ、自動的に解決してくれる言語仕様ならそれにこしたことはないけど。 どんな仕様だったらいいものなのかね?
816 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 18:12:25 ] Rubyとずれるが、Windowsでゲーム作って公開したときに、 エクスプローラーから実行すると動かないという意味不明な問い合わせがきてだな、 アドレスバーに直接exeのフルパス打ち込むと、カレントディレクトリがアプリのディレクトリと異なるのでうごかない という現象に遭遇して、 結局、アドホックに"起動直後にexeのディレクトリをカレントディレクトリに設定"などという処理を入れて、 回避したんだよ。 Rubyだったら、最初に起動するスクリプトで Dir.chdir(File.dirname(__FILE__)) なんかだせえw
817 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 20:40:33 ] >>811 > require は引数をフルパスにしても動作保証がなかったはずだし してるよ。
818 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 21:08:02 ] 1.9ならrequire_relativeってのが有る ttp://doc.loveruby.net/refm/api/view/method/Kernel/m/require_relative
819 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 21:58:40 ] 作者がウィンドウズ使ってない弊害だろう。リナックス使ってるのだっけか。
820 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 22:12:14 ] >require_relative いつのまにこんな便利メソッドが! Ruby 1.9.x で追加されたけど、あまり表舞台にあがってないメソッドっていろいろあるよね CHANGELOGとか見返せば分かるのかな
821 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 22:18:07 ] rubyにスパイウェア仕込んでメソッドの呼び出し状況を収集して ruby-lang.orgに送信して使われてないメソッドのプロモーションとかすればいいのに
822 名前:デフォルトの名無しさん [2009/05/09(土) 22:30:06 ] 推奨プラットフォームがLinuxだっけか。
823 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:31:32 ] *Supported* なのは唯一Debianのみ。 Supportedの意味はサイト参照。
824 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:37:26 ] デビアン使ってない信者は負け組だな。
825 名前:デフォルトの名無しさん [2009/05/10(日) 08:41:33 ] www.infoq.com/jp/news/2007/09/ruby-shoes のサンプルコードの一文 l = text "0" のtextとはどういう意味でしょうか?
826 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 09:03:25 ] l = text("0") メソッド text に引数 "0" を渡してるだけ スニペットってことはモジュール使用例の一部分だけを抜き出してるからこんな見かけなのだろう
827 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:22:26 ] ("0") < オハヨウ!
828 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 13:00:48 ] Rubyの場合、コーディングでの改行は必須なのでしょうか? (言語によっては、改行は実質無視されるものもあります) 例えば、対話環境 irb で $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> を $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> と書くのは不可でしょうか?
829 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 13:03:26 ] >>828 区切りに改行か ; が必要。 >$ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> ・・・書かなくていいところまで書くなよw
830 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 13:40:31 ] >>828 irbに対するprint1つじゃ改行もへったくれもないぞ 。
831 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:53:32 ] >>828 何の釣りだよw
832 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 12:28:03 ] >>828 ___ ━┓ ___ ━┓ / ― \ ┏┛/ ―\ ┏┛ / (●) \ヽ ・. /ノ (●)\ ・ / (⌒ (●) /. | (●) ⌒)\ /  ̄ヽ__) / | (__ノ ̄ | /´ ___/ \ / | \ \ _ノ | | /´ `\
833 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 19:33:10 ] ファイルの個数を拡張子ごとに数えるもっとシンプルな書き方ないですか? exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r } ちなみに、File.extname() を使っていないのはバグがあったからです。
834 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 19:37:40 ] >>833 なんかイラっとくる。いや俺も初心者だけど。vって何?
835 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:01:54 ] counts = Hash.new{|h, k| h[k] = 0} Dir.glob('*').each do |path| next if File.directory?(path) counts[File.extname(path)] += 1 end counts = Hash.new.update(counts)