执行以下语句后,变量 'roses' 和 'violets' 将包含什么?
roses = "blue" && "red"
violets = "blue" and "red"
我期望roses =“red”,violets =“blue”,因为运算符的优先顺序是:
- &&
- =
- 和
但是 irb 将它们都显示为“红色”。有什么解释吗?
执行以下语句后,变量 'roses' 和 'violets' 将包含什么?
roses = "blue" && "red"
violets = "blue" and "red"
我期望roses =“red”,violets =“blue”,因为运算符的优先顺序是:
但是 irb 将它们都显示为“红色”。有什么解释吗?
不要混淆表达式的赋值和整体值。两行(作为整个表达式)都评估为“red”,因为那里没有短路,并且“red”是最后评估的表达式。你自己看:
roses = "blue" && "red" # => "red"
violets = "blue" and "red" # => "red"
roses # => "red"
violets # => "blue"
更进一步,让我们根据优先级放置一些括号
violets = "blue" and "red"
变成
(violets = "blue") and "red"
变成
("blue") and "red"
变成
"red"
这就是 `violets' 被赋予“蓝色”的方式,但整个表达式的计算结果为“红色”。
请记住,
&&
and||
运算符应用于布尔表达式评估和/或控制流评估。来源:-ruby-style-guide
&&、and、|| 或全部都是Ruby 中的短路运算符。但
or
优先级低于||
;and
has 的优先级低于&&
。来源:-Boolean operators in various languages
也就是说,来源:Operator Precedence Table
-
&&
并且||
具有比 更高的优先级。因此,=
您的表达式roses = "blue" && "red"
实际上变成 了roses = ("blue" && "red")
=
具有比and
and更高的优先级。因此,or
您的表达式violets = "blue" and "red"
实际上变为(violets = "blue") and "red"