yield

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)