非块变量是强制性的:
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
像这样设计的块变量与非块变量相比有什么优势?
答案 0 :(得分:5)
当没有给出块时抛出错误没有多大意义,因为如果没有块,任何使用yield
或block.call
的方法都会抛出错误。
提供默认块也没有多大意义,因为要执行的默认代码只能写入方法本身(这比编写内联参数更简洁)。