执行以下语句后,变量'roses'和'violets'包含什么?
roses = "blue" && "red"
violets = "blue" and "red"
我期望玫瑰=“红色”,紫罗兰=“蓝色”,因为运营商的优先顺序是:
但是irb将它们都显示为“红色”。任何解释?
答案 0 :(得分:3)
不要混淆表达式的赋值和整体值。两条线(作为整个表达式)评估为“红色”,因为那里没有短路,“红色”是评估的最后一个表达式。亲眼看看:
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"
这就是“紫罗兰”被分配为“蓝色”的方式,但整个表达式的评估结果为“红色”。
答案 1 :(得分:2)
请记住,
&&
和||
运算符应该用于布尔表达式求值和/或控制流评估。来源: -ruby-style-guide
&&,and,||或者所有都是Ruby中的短路运算符。但
or
的优先级低于||
;and
的优先级低于&&
。来源: -Boolean operators in various languages
那说,来源: - Operator Precedence Table
-
&&
和||
的优先级高于=
。因此,您的表达式roses = "blue" && "red"
实际上已成为roses = ("blue" && "red")
=
的优先级高于and
和or
。因此,您的表达式violets = "blue" and "red"
实际上已成为(violets = "blue") and "red"