为什么符号不等于符号

时间:2019-02-14 20:46:50

标签: ruby

我做到了:

x = :foo, y = %q{foo}.to_sym, x.==(y)
# => [:foo, :foo, false] 

我想知道为什么:foo不等于:foo

2 个答案:

答案 0 :(得分:8)

并行分配在Ruby中的工作方式有所不同,如果要在一行上显示多个语句,则需要使用分号(而不是逗号)将它们分开。

您执行的语句:

x = :foo, y = %q{foo}.to_sym, x == y

等效于:

x = [:foo, y = %q{foo}.to_sym, x == y]

在评估表达式的右侧时,尚未定义x,因此最后一项有效地比较了nil:fooy赋值也会在表达式的右侧求值时发生,并且结果将包含在分配给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的令人讨厌的功能。