为什么表达式 (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= 相同] 和 <=>
方法(所有这些都具有相同的优先级,并且专门形成一个单独的优先级组)。
因此,如果上述列表中的多个运算符被链接成一行,则评估顺序应通过任一方式明确设置
括号()
:
(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
Ruby:
true == true == true
syntax error, unexpected tEQ
对比JavaScript:
true == true == true
// => true
对比C:
1 == 1 == 1
// => 1
没有为 ==
方法定义关联方向,它控制运算符对其参数求值的顺序,与 ===
、!=
、[=15= 相同] 和 <=>
方法(所有这些都具有相同的优先级,并且专门形成一个单独的优先级组)。
因此,如果上述列表中的多个运算符被链接成一行,则评估顺序应通过任一方式明确设置
括号
()
:(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。
(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