Rrr*_*Rrr 65 ruby operators syntax-error operator-precedence associativity
Ruby:
true == true == true
Run Code Online (Sandbox Code Playgroud)
语法错误,意外的tEQ
与JavaScript:
true == true == true
// => true
Run Code Online (Sandbox Code Playgroud)
与C:
1 == 1 == 1
// => 1
Run Code Online (Sandbox Code Playgroud)
pot*_*hin 48
关联方向,其控制具有它们的参数评价操作者的顺序,没有为定义==
方法,相同===
,!=
,=~
和<=>
方法,以及(它们都具有相同的优先级和排他地形成单独的优先级组).
因此,如果上述列表中的多个运算符连续链接的情况下的评估顺序应该通过任一方式明确设置
括号()
:
(true == true) == true # => true
true == (true == true) # => true
Run Code Online (Sandbox Code Playgroud)或点运算符.
(可以省略连续的最后一次相等检查):
true .== true == true # => true
Run Code Online (Sandbox Code Playgroud)如果我正确地理解了这个问题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,因为它将前两个值的结果与第三个值进行比较