为什么没有块参数的方法定义可以接受块?

时间:2013-03-18 02:58:24

标签: ruby

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

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

1 个答案:

答案 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