非块变量是强制性的:
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
与非块变量相比,这样设计块变量的优势是什么?