考虑以下代码:
x = 1
λ = ->(x = x) { puts "[#{x}]"; x = 2; puts "[#{x}]" }
我希望最高级别局部变量x
的值将用作lambda局部变量x
的默认值。也就是说,上面的代码应该或多或少等同于:
λ = ->(x = 1) { puts "[#{x}]"; x = 2; puts "[#{x}]" }
不幸的是,情况并非如此:(x = x)
不会被这样对待,而lambda的本地x
最初设置为nil
:
λ.()
#⇒ []
# [2]
为什么(x = x)
中的RHO不是从最外层binding
获取的?
答案 0 :(得分:3)
λ = ->(x = x) {…}
在上面的代码x
中,参数标识符覆盖了同名的当前范围局部变量,因此默认值已经引用此参数而不是原始x
。
对于默认值,您可以使用不同的局部变量名称,实例变量,或者如果坚持,则通过x
获取外部Binding#local_variable_get
。