Lambda局部变量默认值无法使用闭合的局部变量

时间:2016-12-28 17:57:01

标签: ruby lambda proc

考虑以下代码:

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获取的?

1 个答案:

答案 0 :(得分:3)

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

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

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