2013-10-01 8 views
7

ブロックをProcに渡すことが可能かどうか疑問に思っています。単純に動作しませんProc.callにブロックを渡す:ブロックをProcに渡すことはできますか?

foo = Proc.new { 
    yield 
} 

foo.call { 
    puts "test" 
} 

結果内:同じことがラムダで発生

LocalJumpError: no block given (yield)

。中

class Foo 
    def bar 
    yield 
    end 
end 

bar = Foo.new.method :bar 

bar.call { puts "Success!" } 

結果:ただし、このはメソッドオブジェクトで作業を行い

bar.to_proc.call { puts "Success!" } 

Success!

奇妙なことは、それはまだprocのにメソッドオブジェクトを変換した後の作品ということです

結果:

Success!

ブロックから作られたProcはどのようにブロックを受け入れませんが、もともとは方法であったProcはどうしますか?ブロックを受け入れるブロックからProcsを作成することは可能ですか?

+1

[Proc内のブロックを評価することはできますか?](http://stackoverflow.com/questions/17818160/can-i-evaluate-a-block-inside-a-proc) –

+0

まだ開いています私にとって関連する質問:ブロックを生成する方法が得られるか? –

答えて

5

Procsはブロックを暗黙の引数(あなたが試みている形式)として受け入れることができません。 proc 他のprocオブジェクトを明示的に、または&引数を引数として引数として受け取ることができます。例:

a = Proc.new do |&block| 
    block.call 
end 

a.call() {puts "hi"} 

yieldだけ方法の文脈で動作laguageレベル魔法のビットです。

+2

* blocks *は他のブロックを暗黙の引数として受け入れることができないということですか?私が私の質問で実証したように、procs *は、メソッドからprocsに変換された場合、*できます。 – Hubro

+0

@Codemonkey:あまりにもprocが&引数を生成することは確かです。 – Linuxios

+0

興味深いことにとても助かりました。ありがとう! –

関連する問題