9

ブロックをProcに渡すことができるかどうか疑問に思っています。単にブロックを渡すだけでProc.callは機能しません:

foo = Proc.new {
  yield
}

foo.call {
  puts "test"
}

結果:

LocalJumpError: ブロックが指定されていません (yield)

同じことがラムダでも起こります。ただし、これメソッド オブジェクトで機能します。

class Foo
  def bar
    yield
  end
end

bar = Foo.new.method :bar

bar.call { puts "Success!" }

結果:

成功!

奇妙なことに、メソッド オブジェクトを proc に変換した後も機能します。

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

結果:

成功!

では、なぜブロックから作られた Proc はブロックを受け入れないのに、もともとメソッドだった Proc はブロックを受け入れるのでしょうか? ブロックを受け入れるブロックから Proc を作成することは可能ですか?

4

2 に答える 2

10

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

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

a.call() {puts "hi"}

yieldメソッドのコンテキストでのみ機能する言語レベルの魔法です。

于 2013-10-01T23:42:19.163 に答える