2

为什么没有块参数的方法定义可以接受块?这是演示代码:

def fun
 yield
end
fun {puts 'hello ruby'}
4

1 回答 1

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
于 2013-03-18T03:01:03.143 回答