为什么表达式 (true == true == true) 会产生语法错误?

Why does the expression (true == true == true) produce a syntax error?

Ruby:

true == true == true

syntax error, unexpected tEQ

对比JavaScript:

true == true == true
// => true

对比C:

1 == 1 == 1
// => 1

没有为 == 方法定义关联方向,它控制运算符对其参数求值的顺序,与 ===!=、[=15= 相同] 和 <=> 方法(所有这些都具有相同的优先级,并且专门形成一个单独的优先级组)。

Documentation

因此,如果上述列表中的多个运算符被链接成一行,则评估顺序应通过任一方式明确设置

  • 括号():

    (true == true) == true # => true
    true == (true == true) # => true
    
  • 或点运算符.连续最后一个相等检查可以省略):

    true .== true == true # => true
    

TL;DR 语法意味着所有 3 个值都相等,这不是它在 javascript 或 C 中所做的,所以通过 ruby 给出语法错误,这为它打开了大门将来实施。

如果我对问题的理解正确,value_a == value_b == value_c 只有在使用 == 作为比较运算符都相等时才 return 为真,如本方法所示

# version 1
def compare_3_values(a, b, c)
  a == b && a == c && b == c
end

不过还有另一种可能的预期结果。如前一个答案所示实施此操作:

#version 2
def compare_3_values(a, b, c)
  (a == b) == c
end

结果天壤之别。

JavaScript 总是使用版本 2,这是非常无用的,因为第三项总是与 true 或 false 进行比较(如果第三项是整数,则为 0 或 1)这就是为什么 false == false == true return是真的。

The good news is that because ruby gives a syntax error it's the only language that can implement this without breaking everyone's code.

for any other language it would break so much code that even if it were implemented in a later major version there would need to be a flag/setting to turn this on or off for years to come, hence it will never be worthwhile.

Ruby

中的一些有趣结果
false .== false == true
=> true

false .== true == false
=> true

true .== false == false
=> true

false .== false == false
=> false

true .== true == false
false

并且在javascript

false == false == true
=> true

false == true == false
=> true

true == false == false
=> true

false == false == false
=> false

true == true == false
=> false

Edit 也在 C 中进行了测试,其行为与 JavaScript 相似,因为它将前两个值的结果与第三个值

进行比较

非常好,但以防万一它不完全清楚(以及人们问为什么),这里还有几个例子。


在 C 中,== 运算符是从左到右关联的,布尔值表示为 1(真)和 0(假),因此第一个 1 == 1 的计算结果为 1 (true) 然后你用第二个表达式评估第一个表达式的结果。你可以试试:

2 == 2 == 2 // => 0

在 C 中,计算为:

(2 == 2) == 2
1 == 2 // => 0

在Javascript中,与C类似,==是从左到右结合的。这次让我们尝试使用 0(尽管 C 中的相同示例也可以):

0 == 0 == 0
false

再次:

0 == 0 == 0
true == 0 // => false

In Ruby == 没有关联属性,即。它不能在单个表达式中多次使用,因此无法评估表达式。为什么做出这个决定是语言作者的问题。此外,Ruby 没有将数字 1 定义为布尔值,因此 1 == true 的计算结果为 false。

指出 Ruby 中有一些 "weird" 个案例,但它们都按预期进行评估:

(1 == 1) == 1
true == 1 # => false

1 == (1 == 1)
1 == true # => false

1 .== 1 == 1
(1 == 1) == 1
true == 1 # => false

false .== false == true
(false == false) == true
true == true # => true

false .== true == false
(false == true) == false
false == false # => true

true .== false == false
(true == false) == false
false == false # => true

false .== false == false
(false == false) == false
true == false # => false

true .== true == false
(true == true) == false
true == false # => false