Ruby 为什么块变量是可选的?

Ruby 为什么块变量是可选的?,ruby,block,optional-parameters,Ruby,Block,Optional Parameters,非块变量是必需的: 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 # =>

非块变量是必需的:

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

与非块变量相比,这样设计块变量有什么好处?

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