在您的方法中添加任何参数,名称在很大程度上是主观的。通常你会看到 &block 只是按照约定使用,但名称本身可以是任何你想要的,只要它是一个有效的变量名。
在您的示例中,您声明了一个块名称,但实际上并未使用该名称。请记住,任何 Ruby 方法都可以被赋予一个块,没有办法限制这一点,但如果需要,由方法本身来使用该块。该块可以立即或在将来的某个时间被调用零次或多次。将块交给方法会放弃控制,因此请务必仔细阅读任何给定方法的文档。可能会有惊喜。
如果您需要链接一个块,请使用名称声明它:
def passes_through(&block)
[ 1, 2, 3, 4 ].each(&block)
end
如果你要去街区的yield,这里就不需要了:
def direct_call
[ 1, 2, 3, 4 ].each do |n|
yield n
end
end
如果您要保留调用并稍后使用它,这也是命名它的情况:
def preserved_call(&block)
@callback = block
end
def make_callback
@callback and @callback.call
end
任何方法都可以检查是否提供了块:
def tests_for_block
if (block_given?)
yield 'value'
else
'value'
end
end
通过在方法签名中声明块来捕获块的成本很小但可衡量,必须进行大量计算才能正确捕获可能在闭包情况下使用的所有变量。在性能敏感的代码中,您需要避免这种情况。
您可以动态创建块:
def captures_conditionally
if (block_given?)
@callback = Proc.new
end
end
Proc.new 方法将假定控制已提供给该方法的任何块(如果有的话)。