pot*_*hin 48

关联方向,其控制具有它们的参数评价操作者的顺序,没有为定义==方法,相同===,!=,=~<=>方法,以及(它们都具有相同的优先级和排他地形成单独的优先级组).

文档

因此,如果上述列表中的多个运算符连续链接的情况下的评估顺序应该通过任一方式明确设置

  • @CarySwoveland可能是因为`= = 1 == 1`会在Ruby中评估为'false`,如果`==`是左关联的,这可能会导致几个错误.它也没有多大意义 - 第三个操作数的唯一合理值是`true`和`false`,即`a == b == true`和`a == b == false`可以是表示为"a == b`和`a!= b`. (13认同)
  • @CarySwoveland我认为可以从语言设计师的观点来解决,如[this](https://gist.github.com/anonymous/9593113c3a4323692676d44f5adaa9c9) (3认同)
  • @Stefan:只有一种情况可以像这样使用它有意义的方式,虽然我必须说这个例子有点牵强:`==`可以在自定义类中重写,因此等式检查可以返回除"true"或"false"之外的其他内容(例如,``nil`) (2认同)

Ary*_*man 6

TL; DR语法暗示所有3个值都相等,这不是它在javascript或C中的作用,因此通过ruby给出语法错误,将来可以实现此门.

如果我正确地理解了这个问题value_a == value_b == value_c应该只返回true,如果它们都是eqel使用==作为比较操作符,如此方法所示

# version 1
def compare_3_values(a, b, c)
  a == b && a == c && b == c
end
Run Code Online (Sandbox Code Playgroud)

但是还有另一种可能的预期结果.如前面的答案所示实现这个:

#version 2
def compare_3_values(a, b, c)
  (a == b) == c
end
Run Code Online (Sandbox Code Playgroud)

结果是世界分开的.

JavaScript总是使用版本2,这是非常无用的,因为第3项始终与true或false进行比较(如果第3项是整数,则为0或1),这就是为什么false == false == true返回true.

为了确保如果一个方法是它只调用一次的三个值之一,我们必须创建所有三个变量的副本(而不是引用),然后进行这样的比较:

def compare_3_values(a_original, b_original, c_original)
  #duplicate all three values as a, b, c
  a, b, c = a_original.dup, b_original.dup, c_original.dup

  a == b && b == c && a == c
end
Run Code Online (Sandbox Code Playgroud)

好消息是因为ruby提供了语法错误,因此它是唯一可以在不破坏每个人代码的情况下实现此功能的语言.

对于任何其他语言,它会破坏如此多的代码,即使它是在后来的主要版本中实现的,也需要有一个标志/设置来在未来几年打开或关闭它,因此它永远不值得.

Ruby中的一些有趣结果

false .== false == true
=> true

false .== true == false
=> true

true .== false == false
=> true

false .== false == false
=> false

true .== true == false
false
Run Code Online (Sandbox Code Playgroud)

并在JavaScript中

false == false == true
=> true

false == true == false
=> true

true == false == false
=> true

false == false == false
=> false

true == true == false
=> false
Run Code Online (Sandbox Code Playgroud)

编辑在C中进行测试,其行为类似于JavaScript,因为它将前两个值的结果与第三个值进行比较