Ruby运算符优先级问题

时间:2013-07-01 12:02:15

标签: ruby operator-precedence

执行以下语句后,变量'roses'和'violets'包含什么?

roses = "blue" && "red"
violets = "blue" and "red"

我期望玫瑰=“红色”,紫罗兰=“蓝色”,因为运营商的优先顺序是:

  1. &安培;&安培;
  2. =
  3. 但是irb将它们都显示为“红色”。任何解释?

2 个答案:

答案 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")

  •   
  • =的优先级高于andor。因此,您的表达式violets = "blue" and "red"实际上已成为   (violets = "blue") and "red"

  •