1 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 08:39:14 ] プログラミング言語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つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
6 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 09:42:59 ] 本スレより。 764 名前:デフォルトの名無しさん[sage] 投稿日:2010/01/28(木) 07:15:32 初心者スレが落ちてるのでこっちで。 関数で呼び出し元のselfを自動で引数として受け取るようにす ることってできますか。 こんな感じで。 def func(hoge=呼び出し元のself) p hoge end モジュールにしてMix-inさせるとかは無しでお願いします。
7 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 09:47:11 ] スレ立て乙 >>6 呼び出し元で this を渡してやるしかないかなぁ。
8 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 09:56:42 ] thisってなんですか? thisってなんですか? thisってなんですか? thisってなんですか? thisってなんですか?
9 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:16:25 ] ルー語も知らないゆとりか
10 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:19:38 ] そっちのほうが余計意味通らんわwwww
11 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:33:06 ] 渡す方が this で受け取る方が self っつーのもなんだかなぁ
12 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:44:50 ] DateTimeとかで27時など、24時を過ぎた時間を上手く扱う方法はありますか? 「2010年1月28日 26時30分」 t1 = DateTime.new(2010, 1, 28, 26, 30) はinvalid dateになります。 今はactive_supportを使って、 「2010年1月28日 26時30分」を t2 = DateTime.new(2010, 1, 28, 0, 0) t2 = t2.advance :hours => 26 t2 = t2.advance :minutes => 30 とやっています。これで月末や年末の年月日時の繰り上げもうまく動きます。 問題は逆方法で、 t2.to_s をするときに、「2010年1月28日 26時30分」の形式にする、 便利なヘルパーメソッドとかはあるのでしょうか?
13 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:47:19 ] >「2010年1月28日 26時30分」の形式にする 無茶言うな あったらあったで楽しそうだが
14 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:49:32 ] じゃあ翌日午前10時は前日の34時かというとそうではないわけで (たぶんそれは10時のままにして欲しいと言うはず) 自前で適当だと思う範囲を変換して作るしかないね
15 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 11:02:12 ] 27時はありだけど28時はないんだそうだ 28時と表現したら怒られた よくわからん
16 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 12:29:14 ] 関数ってなんですか? Kernel.private_instance_methods(false)のことですか?わかりません><
17 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 14:29:16 ] >>15 マスコミ関係の方ですか?
18 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 16:25:43 ] str = 'first,second"a,b,c"second,third' という文字列があったとして ダブルクオーテーションの中以外のカンマにマッチする正規表現ってありませんか?
19 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 16:57:00 ] Ruby関係ねえええ
20 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 17:10:46 ] irb> str = 'first,second"a,b,c"second,third' irb> p str.gsub(/".+?"/){' '}.gsub(/,/){' '} "first second second third" こんなんじゃ駄目なんだろうなあ
21 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 17:24:03 ] >>18 最終的にしたいことは何でしょうか? ダブルクオーテーションの中以外のカンマの数を数えたいとか、 ダブルクオーテーションの中以外のカンマでsplitしたいとか。
22 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 17:30:18 ] >>21 後者です。 str.split(regexp) #=>["first", "second\"a,b,c\"second", "third"] というのを期待しています。 ダブルクオーテーションはネストしないと仮定しています。 正規表現は難しいです。
23 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 17:36:58 ] >>19 正規表現スレを見つけました。 正規表現スレに移動した方がよろしいでしょうか?
24 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 17:47:26 ] >>22 うおめんどくさ
25 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 18:08:58 ] 題意に沿わず、長く、そして美しくない str = 'first,second"a,b,c"second,third' require 'strscan' COMMA = /\A,\Z/ QUOTE = /".*?"/ SCAN_REG = /#{QUOTE}|./ def parse(str) result = [""] scanner = StringScanner.new(str) while match = scanner.scan(SCAN_REG) case match when COMMA; result << "" else ; result.last << match end end result end p parse(str) #=> ["first", "second\"a,b,c\"second", "third"]
26 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 18:11:07 ] >>23 多分、正規表現だけでは無理なのでここでいいんじゃないかな
27 名前:デフォルトの名無しさん [2010/01/28(木) 18:30:36 ] 一応出来た。でもバグがあるかもしれないから(;_;) 僕にもっと考える時間と頭をください。 条件を満たすカンマにマッチする正規表現を考えるから難しいのかなー、と思って 違う考え方をしてみた。 str = 'first,second"a,b,c"second,third' str.scan /(?:[^",]+"[^"]+"[^",]+)+|[^,]+/ => ["first", "second\"a,b,c\"second", "third"] あとは、これを頭のいい人が改良するだけでつ(;_;)
28 名前:27 [2010/01/28(木) 18:47:21 ] うわ、やっぱりバグありまくりですね。 個人的には、正規表現は難しいし、魔法じゃないし 言語のチカラを借りて何とかする方が楽かなー、って思う。 んと、C使いだったら一文字ずつ調べてみるけど...
29 名前:デフォルトの名無しさん [2010/01/28(木) 18:49:45 ]
30 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 19:24:17 ] 一旦NUL文字にして、後で戻すとかどう? str = 'first,second"a,b,c"second,third' arr = str.gsub(/".*?"/){|m| m.gsub(/,/, "\0")}.split(/,/).map{|a| a.gsub(/\0/, ',')} p arr #=> ["first", "second\"a,b,c\"second", "third"]
31 名前:18 mailto:sage [2010/01/28(木) 19:52:09 ] 短時間にこれだけレスを頂けるとは思ってもみませんでした。 >>27 カンマ以外の文字列からアプローチする方法は思いつきませんでした。 発送の転換ですね。 一文字づつ調べるというのは>>25 氏の方法に近いですね。 >>30 この方法は漏れが少なそうに思います。 >>27 氏と>>30 氏の方法をベースに検討してみようと思います。 ありがとうございました。
32 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 20:03:12 ] /(?:[^",]*"[^"]*"[^",]*)+|[^,]+/ こんな感じニカ?
33 名前:デフォルトの名無しさん [2010/01/28(木) 21:18:59 ] 鬼車の田中哲スペシャルってこーゆーとき活用できるもん?
34 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 21:41:50 ] 面倒臭いから区切りを " " にするよう説得して Shellwords.shellwords を使う。だめか。 CSV だと思って CSV.parse_line する。だめだって。通らないし。
35 名前:デフォルトの名無しさん [2010/01/28(木) 21:50:19 ] 問答無用で , で豚切りしてから、 " を含む物から次の " を含むものまでを , で連結したものに置換える。
36 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 22:19:46 ] >>35 それだと分割したリストを"求めて尋ねる歩く旅に出ないといけなくなるわけだが・・・
37 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 22:52:03 ] 基本、このタイプは無闇にめんどくさい
38 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 06:11:42 ] RubyはC言語で出来ているのでしょうか?
39 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 06:42:16 ] >>38 そうだよ。なんならソースをダウンロードして中身をのぞいてみたら? それを知ってどうするのかは知らんけどさ。
40 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 08:35:40 ] それでも鬼車なら・・・鬼車ならきっと何とかしてくれる
41 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 10:03:32 ] Ruby 初心者スレッド Part 33 pc12.2ch.net/test/read.cgi/tech/1259990485/998 > 998 名前:デフォルトの名無しさん[sage] 投稿日:2010/01/27(水) 09:38:00 > Rubyですごい事が出来た実例を教えて下さい。 Ruby(Rails)で上場しちゃった会社(というと語弊があるがw) クックパッド(株)【2193】:銘柄情報 - Yahoo!ファイナンス stocks.finance.yahoo.co.jp/stocks/detail/?code=2193
42 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 10:59:48 ] > 998 名前:デフォルトの名無しさん[sage] 投稿日:2010/01/27(水) 09:38:00 > Rubyですごい事が出来た実例を教えて下さい。 昔から使ってる人間としては、Rubyで生計を立ててる人がいる時点で信じられん
43 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 11:16:40 ] >>42 20年も経てば、あなたがたはRubyに税金をかけるようになるでしょう
44 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 11:18:45 ] >>18 出遅れた気がするけど、 str = 'first,second"a,b,c"second,third' str.scan(/(?:^|\G,)([^",]*(?:"[^"\\]*(?:\\.[^"\\]*)*"[^",]*)*)/).map{|a|a[0]}
45 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 11:19:48 ] >>43 すでに未踏経由で1000万以上税金突っ込ん出るよ、その成果の一つがYARVだ
46 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 11:35:56 ] >>43 いや電気ほどにはすごくないw
47 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 11:56:00 ] ファラデーか
48 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 13:57:49 ] str.scan /(?:[^",]|"[^"]*?")+|(?=,,|^,|,$)/
49 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 14:27:24 ] メンテナンスしたくない正規表現が続々届いております
50 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 14:31:56 ] 正攻法は>>25 、LLっぽいのは>>35 だと思う
51 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 14:36:07 ] >>49 ちょっと変えたいときに悲惨だな これくらいは読めて欲しい気もするが
52 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 15:51:35 ] \Gの使い方がよくわからなかった自分としては>>44 が勉強になった
53 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 15:53:13 ] 最終的には読めて欲しい 初級を脱したと思ってる人は読めて欲しいなー
54 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 16:34:07 ] 読めても変えたくないエンバグしそう
55 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 16:36:13 ] >>44 の修正、一般にCSVでは"のエスケープは"" str.scan(/(?:^|\G,)([^",]*(?:"[^"]*(?:""[^"]*)*"[^",]*)*)/)
56 名前:27 mailto:sage [2010/01/29(金) 16:45:09 ] ↑ なるほど。勉強になったthx
57 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 19:46:41 ] >>49 正規表現をくれということだから仕方ない
58 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:15:46 ] mingw版のRuby1.8.7バイナリって特にはない? 自力でMinGW導入して手元でコンパイルするしかないのかな
59 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:30:14 ] コンパイルしてみたら? きっと親切なおじさんたちが助けてくれるさ
60 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:07:20 ] えー ひとつだけ質問 Net::HTTPSが使うOpenSSLやirbが使うReadlinesとかは放っておいても入る? んなわけないよね別途用意しなきゃ駄目だよね
61 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:39:37 ] gnuwin32.sourceforge.net/packages/openssl.htm gnuwin32.sourceforge.net/packages/libiconv.htm gnuwin32.sourceforge.net/packages/readline.htm gnuwin32.sourceforge.net/packages/pdcurses.htm gnuwin32.sourceforge.net/packages/zlib.htm gnuwin32.sourceforge.net/packages/gdbm.htm リンク先を見てわからないなら諦めた方がいいかもしれない。 怖くてリンクを踏めないという見解もありうる。
62 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:41:31 ] %w記法で空文字列の要素はどうやって作るの?
63 名前:60 mailto:sage [2010/01/29(金) 21:44:46 ] C:\Documents and Settings\俺\デスクトップ>gem install rake C:/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_origin al_require': no such file to load -- zlib (LoadError) うひょう
64 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:44:57 ] %Wならできるが、%wでは無理だね
65 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:45:46 ] %wじゃむりじゃね? 大文字の方なら p %W[hoge fuga #{nil} ] #=>["hoge", "fuga", ""]
66 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:53:29 ] 式展開じゃないとダメか #{nil}はnilになるのかと思ったら""なのね。何で? nil要素は作れない?
67 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:57:08 ] 要素が文字列である配列を作る記法だからでしょう またレスかぶりそう
68 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:05:56 ] 了解。みんなありがと
69 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:11:45 ] >>66 irb(main)> "#{nil}" => ""
70 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:25:58 ] >>58 いろいろあったんだが、Windowsの場合は自分だけMinGW32にしても意味がない、という結論に至った 配布されてるバイナリのバージョンと揃えておいて、同じようにエラー出したり同じように変な動きしたりするほうがいい
71 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:30:02 ] 普段CをMinGWでコンパイルしていて Rubyの拡張ライブラリもMinGWでコンパイルしたいんだもん という人がRubyをMinGWでコンパイルしているんだと思う。 あとメンテナか。
72 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:36:41 ] これからMinGWにしてこうぜー、という動きがあるのはある気がするが 「よくわかんないいっぱんゆーざー」がわざわざコンパイルしてまで使用するようなもんでもない ただしMinGWの知識がある人はどんどん使って色々言ってくれ
73 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:09:14 ] class NiseArray < Array; end a = NiseArray.new p a.class #=> NiseArray b = a.map{} p b.class #=> Array bがワナビーNiseArrayなんだがドゥーしたらいいんだ? オレにティーチしてくれよ。
74 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:25:11 ] セルフのクラスのオブジェクトをリターンするようにデファインされてないんだよな 継承を考慮してないもともとのクラスのデザインのミステイクではある
75 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:31:20 ] Enumerableはeachさえあれば配列じゃなかろうと動くようにしてあるんだから仕方ない ArrayのメソッドならちゃんとNiseArrayが返すはず
76 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:36:39 ] ビルトインクラスは普通のオブジェクトと微妙に構造が違うから継承すんなボケ、 っつーかお前のそのクラスはビルトインクラスを継承するだけの動作をするのか、あー? という怖い感じのが一応スタンス メソッドが欲しいだけなら普通は委譲を使う
77 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:39:33 ] 委譲遅いじゃん はい論破
78 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:41:22 ] 委譲とかあのへんは遅いよね 継承を使いたくなるくらい遅いというのは実効上の説得力がない
79 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:41:44 ] この例に限って言えば dup/clone してから map! すりゃいいんじゃね
80 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:44:04 ] >>78 ディスパッチテーブルを もう一回引く程度のコストが許容できないなら その問題にRubyは使えないんじゃないかね
81 名前:73 mailto:sage [2010/01/30(土) 00:17:48 ] Arrayオリジナルのメソッドでcollect/mapとselectはNiseArrayではなくArrayを返す。 ほかはNiseArrayを返す。 あとEnumerableは基本的にArrayを返す。 これらは継承では全滅ということでOKですか? delegateに馴染みがないので軽いサンプルをいただけると助かります。 もちろん自分でリファレンスマニュアルを読んでみます。
82 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:32:52 ] >>81 自作ライブラリのコード漁ってたらこんなの出てきた でも、正直これは設計ミスだったと思ってる %w{ find_all reject select sort sort_by }.each do |method| class_eval %{ def #{method} self.class.new(super) end } end %w{ & * + - grep }.each do |method| class_eval %{ def #{method}(arg) self.class.new(super) end } end
83 名前:82 mailto:sage [2010/01/30(土) 06:10:54 ] 話の流れ上 delegate のサンプルを貼るべきところだったな、ごめんw 継承するとこうなるぞってことで
84 名前:73 mailto:sage [2010/01/30(土) 10:50:29 ] #-----hoge1.rb class NiseArray < Array instance_methods.each do |method| define_method(method) do |*args, &block| result = super(*args, &block) result.class == Array ? NiseArray.new(result) : result end end end p NiseArray.new.map{}.class #=> NiseArray #-----hoge2.rb require 'delegate' class NiseArray < DelegateClass(Array) def initialize super(Array.new) end end p NiseArray.new.map{}.class #=> Array #なんでノットNiseArrayなのかミーにはホワイなんです><
85 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 14:01:51 ] class A def initialize(a=Array.new); @a=a; end def method_missing(*arg, &block); A.new(@a.__send__(*arg, &block)); end def to_a; @a; end def to_ary; @a; end end irb> a = A.new([1, 2, 3, 4, 5]) irb> a.delete(5) irb> p a #<A:0xb7cf21c0 @a=[1, 2, 3, 4]> irb> p a.map{|e| e*2} #<A:0xb7cecb30 @a=[2, 4, 6, 8]> irb> p a.class A irb> p a.to_a [1, 2, 3, 4] irb> p Hash[*a] {1=>2, 3=>4}
86 名前:73 mailto:sage [2010/01/30(土) 14:46:42 ] おおお素晴らしい 鮮やかに委譲してますね。 しかも直感的でわかりやすい。 #all?など返り値が委譲先のオブジェクトでないメソッドも少し手直しすれば動きそうです。 勉強になりました。参考にさせてもらいます。
87 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 17:55:24 ] $KCODE='u' 'あ' =~ /\xe3/ #=> 0 'あ' =~ /[\xe3]/ #=> nil となります。 $KCODEを指定しないとどちらも同じ挙動になるんですが。 これは意図した動作なんでしょうか。 手元の環境は ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] です。
88 名前:デフォルトの名無しさん [2010/01/30(土) 18:58:31 ] $KCODEのデフォルトは n なので、 $KCODE を設定しないということは 'あ' はただのバイト列として 0xe3 と比較される。
89 名前:デフォルトの名無しさん [2010/01/30(土) 19:11:04 ] おや、'u'のとき前者がマッチするのか…
90 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 22:20:20 ] p BasicObject === BasicObject #=> true p Class === Class #=> true p Module === Module #=> true p Object === Object #=> true p String === String #=> false p Array === Array #=> false p BasicObject.class #=> Class p Array.class #=> Class p Kernel === Kernel #=> true p Enumerable === Enumerable #=>false p Kernel.class #=> Module p Enumerable.class #=> Module なんで?教えてえらい人!
91 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 22:52:30 ] >>90 Module#===の定義をリファレンスで読むといいよ selfがモジュールとすると「obj.kind_of?(self) が true の場合、 true を返します」だとさ
92 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:00:03 ] 驚き最小!
93 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:21:41 ] >>90 ===
94 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:22:47 ] ミスったw === が再定義されているから case value when Integer when String end みたいに書けるんじゃないか
95 名前:デフォルトの名無しさん [2010/01/31(日) 00:08:03 ] Proc#===の定義は見ただけでは何を意図したものか分からなかったな…
96 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 07:39:30 ] ||= って何なんでしょう? 代入文みたいに a ||= {} 使うみたいな 辞書の割り当てとかでしょうか?
97 名前:デフォルトの名無しさん [2010/01/31(日) 07:55:53 ] Marshal.dumpでsingleton can't be dumpedというエラーになって悩んでます objの中身はライブラリから返されたもので詳細はわかりません p obj.class #=> Hash p obj.is_a? Singleton #=> false Marshal.dump(obj) #=> TypeError: singleton can't be dumped 以下はエラーになりませんでした obj.each {|k,v| Marshal.dump([k,v])} #=>エラーなし
98 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 08:13:23 ] >>97 そのエラー分かりにくいよね 特異メソッド(およびそれが定義されているオブジェクト)はダンプできませんよって意味 dupしたものをダンプするようにするか、自分で言ってるように中身だけ出すのが正解
99 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 08:40:37 ] >>96 これ書いてる解説少ないんだよな a がNameErrorを返すか、変数 a が存在して偽を返す場合、 a = {} を実行する という程度の意味 実際のスクリプトでは大量に使われているが、初心者用文法解説ではほとんど言及されていない謎の記述
100 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 09:18:07 ] >>96 a += 1 a = a + 1 a ||= {} a = a || {} a が偽と評価される場合に限り a = {} となり、それ以外のときは a = a 変数の初期化を保証するために使われることが多い
101 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 09:23:09 ] >>100 だいたいの意味はそうだからいいんだけど、厳密には a || (a = b) ってことになる ||= と &&= だけちょっと特殊 ってようなのをどっかで見た
102 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:13:45 ] >>101 doc.okkez.net/187/view/spec/operator#selfassign まあobj.foo = obj.fooに副作用がある設計のほうがどうかと思うけどな
103 名前:デフォルトの名無しさん [2010/01/31(日) 14:11:36 ] >>98 ありがとうございます objは再帰的なHashなようでdumpできないオブジェクトが入っている場所は一定ではないようです またTrueClassなどdupできないものも含まれているようです 一気に特異メソッドを取り除いてdumpする方法はないでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:26:44 ] 初めてRubyいじる必要が出てきて,このスレに来てみたが ここ初心者レベルじゃないね。 初心者抜け出して中級者に手が届こうとしてる人たち向けの 初心者脱出スレだな。
105 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:29:35 ] >>104 いや別に puts と p はどう使い分けるんですかみたいな質問でも構わないよ 全く知らないと小難しそうな領域に踏み込めるようになるまでの時間が短い言語だとでも思ってくれ 実行速度がスクリプト言語として普通なレベル(つまり速いわけではない)という点以外は初心者にやさしいほうだと思うけどね
106 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:41:46 ] 初心者の質問にでも 初心者抜け出して中級者に手が届こうとしてる人たちも含めていろんな人が答えるスレでしょ 初心者の質問がなけりゃそのちょっと上の会話になるさ