Lambda 局部变量默认值无法使用 closed 局部变量

Lambda local variable default value fails to use the closured local variable

考虑以下代码:

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

λ = ->(x = x) {…}

在上面的代码中 x 参数标识符掩盖了同名的当前作用域局部变量,因此默认值已经引用了这个参数而不是原始值 x

对于默认值,您可以使用不同的局部变量名称、实例变量,或者如果坚持,通过 Binding#local_variable_get.

获取外部 x