可以在调用时有选择地为 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)