Ruby メソッドでは、任意でブロックを呼び出して提供できます。このブロックは & 接頭辞をメソッドの最後のパラメータに付けると Proc オブジェクトとして任意に利用可能ですが、yield キーワードを使用するといつでも呼び出せます。
構文上、yield キーワードは現在のオブジェクトでのメソッド呼び出しに似ています。パラメータのリストをメソッド呼び出しのように使用して、値を返します。
yield(1, 2) yield 3 x = yield(4)
ブロックの引数がメソッドで名付けられていても、そのメソッドのコードでは Proc オブジェクトを呼び出す代わりに yield を使用してブロックを呼び出せます。
def both_ways(&block) block.call(1) yield(1) end
ただし、この 2 つの形式は同一ではありません。たとえば、Proc#call を再定義すると、1 つ目の呼び出しには影響しますが 2 つ目には影響しません。
ブロックがメソッド内で Proc オブジェクトとして名付けられて取り込めるのと同様に、呼び出しの最後の引数に & 接頭辞を使用すると、Proc もメソッド呼び出し時にブロック位置に挿入できます。
def only_uses_yield
yield
end
a_proc = proc{ puts "called" }
only_uses_yield(&a_proc)