为什么没有块参数的方法定义可以接受块?这是演示代码:
def fun
yield
end
fun {puts 'hello ruby'}
因为这就是红宝石的工作原理。任何方法都可以传递一个块。如果需要,该方法有责任检查是否block_given?
并检查yield
它。
这是隐式块传递。当你声明一个块参数时,会发生一些不同的事情:块被转换为一个 Proc 对象,因此它可以像函数一样被调用并作为参数传递。你不能用隐式块(AFAIK)做到这一点。
def foo &block
block.call 3
bar block
end
# this method expects proc as a regular parameter (not a block), so you can pass
# a block in addition to it (if you so desire)
def bar block
block.call 4
end
foo do |x|
puts "this is #{x}"
end
# >> this is 3
# >> this is 4