5

非块变量是强制性的:

def foo arg; end
foo # => ArgumentError

为了允许可选参数,必须提供默认值:

def foo arg = nil; end
foo # => nil

但是块变量是可选的:

def foo █ end
foo # => nil

如果没有默认值,则分配一个不存在的块变量nil,实际上,块变量不能取默认值:

def foo &block = ->{puts :foo}; end
# => syntax error

相反,方法可以采用定义中不需要的额外块:

def foo; end
foo{puts :foo} # => nil

与非块变量相比,这样设计块变量的优势是什么?

4

1 回答 1

5

当没有给出块时抛出错误没有多大意义,因为任何使用任何一个的方法,或者yield如果block.call没有块,无论如何都会抛出错误。提供默认块也没有多大意义,因为要执行的默认代码可以直接写入方法本身(这比将其与参数内联写入要简洁得多)。

于 2013-08-01T08:36:05.330 回答