我做到了:
x = :foo, y = %q{foo}.to_sym, x.==(y)
# => [:foo, :foo, false]
我想知道为什么:foo
不等于:foo
。
答案 0 :(得分:8)
并行分配在Ruby中的工作方式有所不同,如果要在一行上显示多个语句,则需要使用分号(而不是逗号)将它们分开。
您执行的语句:
x = :foo, y = %q{foo}.to_sym, x == y
等效于:
x = [:foo, y = %q{foo}.to_sym, x == y]
在评估表达式的右侧时,尚未定义x
,因此最后一项有效地比较了nil
和:foo
。 y
赋值也会在表达式的右侧求值时发生,并且结果将包含在分配给x
的数组文字中。
这就是您要做什么:
x, y = :foo, %q{foo}.to_sym; x == y # => true
顺便说一句,x.==(y)
之所以有效是因为:==
从技术上来说是一种方法,但是在惯用的Ruby中,您只需编写x == y
。口译员明白你的意思。
答案 1 :(得分:2)
很好的回答,但是从“尚未定义x”到“最后一项有效地比较nil和:foo。”存在逻辑上的飞跃,尤其是为什么无法解释未定义变量为nil的原因。< / p>
这与在Ruby中如何实现变量提升有关。这也是JavaScript的令人讨厌的功能。