• ベストアンサー

【ruby】無名関数?でブロック付きメソッドって作れませんか?

Proc.new do|arg|  arg.each do |x|   puts x  end end.call([1,2,3,4,5]) 上記のようなものを無名関数と理解しているのですが、 これを下記の様にすると、 Proc.new {|arg|  arg.each do |x|   yield(x)  end }.call([1,2,3,4,5]) do |x|  puts x end no block given とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • toby_jp
  • ベストアンサー率75% (6/8)
回答No.2

lambda do |arg, &block|  arg.each do |x|   block.call(x)  end end.call([1,2,3,4,5]) do |x|  puts x end こんな感じでどうでしゅうか?Proc.newの変わりにlambda使ってますが、procでも同じです。

その他の回答 (3)

  • toby_jp
  • ベストアンサー率75% (6/8)
回答No.4

何度もすいません。追記です。 Proc.new=lambda=proc見たいな感じでつかってしまいまいたが、 細かい挙動は違いますので注意してください。 誤解を与えそうだったので・・・。 ↓以下を参考にして下さい。 Ruby Proc.newとlambdaの違い(追記) - ソースコード備忘録 http://d.hatena.ne.jp/yuki_rinrin/20090831/1251704735

参考URL:
http://d.hatena.ne.jp/yuki_rinrin/20090831/1251704735
kingfruits
質問者

お礼

toby_jpさん、ご回答有難うございました。 Proc.newとlambdaの挙動の違い、頂いた参考ページなどで 確認しておきます。 ご丁寧にありがとうございました。

  • toby_jp
  • ベストアンサー率75% (6/8)
回答No.3

書き忘れてました。 コードが、ちょっと不自然な感じがする?ので、 もしよければどんなことがしたいか言っていただいたほうがいいかもしれません。 もっとスマートな方法が見つかるかと思います。

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.1

Ruby1.9ならブロック引数(&block)を明示してcallすればできます。 Proc.new {|arg, &block| arg.each do |x| block.(x) end }.([1,2,3,4,5]) do |x| puts x end

kingfruits
質問者

お礼

ryu_chanさん、ご回答有難うございます。 知らいない文法なので、まだ感覚的に馴染めませんが、 勉強になりました。

関連するQ&A