为什么没有块参数的方法定义可以接受块?这是演示代码:
def fun
yield
end
fun {puts 'hello ruby'}
答案 0 :(得分:4)
因为这就是红宝石的作用方式。任何方法都可以传递一个块。如果需要,该方法负责检查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