【发布时间】:2016-12-28 17:57:00
【问题描述】:
考虑以下代码:
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 = nil) { x = x || default; ... }其中default是您希望用作默认值的块外、范围内的局部变量. -
@coreyward 我没有问如何克服这个问题,
->(x = default) { ... }就足够了。我问为什么 RHO 没有得到应有的对待。 -
抱怨行为“没有得到应有的对待”不在 Stack Overflow 的范围内,它旨在帮助解决实际的、非假设的编程问题。根据语言创建者,这是 Ruby 中的预期行为。
-
@coreyward 这是一个实际的、非假设的问题。如果不理解,不代表问题不存在。没有任何一种语言的 RHO 会以这种方式运行。答案“
x = x代码优先于常识,并且总是解析为x = nil,尽管有范围”会很好(尽管有点令人沮丧。)