- ベストアンサー
【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 とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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)
何度もすいません。追記です。 Proc.new=lambda=proc見たいな感じでつかってしまいまいたが、 細かい挙動は違いますので注意してください。 誤解を与えそうだったので・・・。 ↓以下を参考にして下さい。 Ruby Proc.newとlambdaの違い(追記) - ソースコード備忘録 http://d.hatena.ne.jp/yuki_rinrin/20090831/1251704735
- toby_jp
- ベストアンサー率75% (6/8)
書き忘れてました。 コードが、ちょっと不自然な感じがする?ので、 もしよければどんなことがしたいか言っていただいたほうがいいかもしれません。 もっとスマートな方法が見つかるかと思います。
- ryu_chan
- ベストアンサー率37% (69/186)
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
お礼
ryu_chanさん、ご回答有難うございます。 知らいない文法なので、まだ感覚的に馴染めませんが、 勉強になりました。
お礼
toby_jpさん、ご回答有難うございました。 Proc.newとlambdaの挙動の違い、頂いた参考ページなどで 確認しておきます。 ご丁寧にありがとうございました。