赋值和条件运算符的运算符优先级

时间:2010-12-15 14:39:06

标签: ruby assignment-operator operator-precedence

我正在为Ruby 1.8和1.9阅读一本名为“Ruby Programming Language”的书。该书说if-operator的优先级低于赋值运算符。如果这是真的,那么我不明白这个表达式是如何工作的:

x = 5 if false

如果赋值运算符具有更高的优先级,那么它应该在if运算符之前执行。因此,在执行if false之前,应将5分配给x。

我误解了优先权吗?

2 个答案:

答案 0 :(得分:1)

分配的优先级越高意味着您的表达式的计算结果为(x = 5) if false,而不是x = (5 if false)。注意,以后也是一个完全有效的表达式。

是否执行每个特定子句由语言规则决定。例如,在三元运算符a ? b : c中,只会执行bc,但不会同时执行。{/ p>

修改
关于差异。

x = (5 if false)中,首先处理分配。但要完成它,我们需要左侧部分,nil,因为5 if false评估为nil。所以,表达式相当于x = nil

(x = 5) if false中,首先处理条件运算符。根据其规则,我们首先要评估条件(false)。由于它是false,因此无需再做任何事情,评估结果为nil

希望这很清楚。

答案 1 :(得分:0)

因为<expr> if <condition>不是一个表达式。它是Ruby的特殊语法糖。它就像:

if <condition>
    <expr>
end

显然,<expr>必须仅在<condition>后进行评估,因为<condition>可以是false