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
考虑以下代码:
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