yield

可以在调用时有选择地为 Ruby 方法提供一个块。您可以有选择地将此块作为 Proc 对象提供(通过在方法的 final 参数中使用 & 前缀),但需要通过使用 yield 关键字使其在任何时候都可以进行调用。

yield 关键字在语法上类似于调用当前对象的方法。它就像方法调用一样使用一组参数,并返回一个值。

 yield(1, 2)
 yield 3
 x = yield(4)

即使在方法中指定了块参数,该方法中的代码也仍然可以使用 yield 调用该块,而不是调用 Proc 对象。

 def both_ways(&block)
   block.call(1)
   yield(1)
 end

但是,这两种形式并不完全相同。例如,重新定义 Proc#call 将影响第一个调用,而不会影响第二个调用。

与将块作为方法中的 Proc 对象进行命名和捕获非常相似,还可以在调用的最后一个参数中使用 & 前缀,以便在进行方法调用时将 Proc 插入到块中。

 def only_uses_yield
   yield
 end
 
 a_proc = proc{ puts "called" }
 only_uses_yield(&a_proc)