我正在为 Ruby 1.8 和 1.9 阅读一本名为“The Ruby Programming Language”的书。这本书说 if-operator 的优先级低于 assignment-operator。如果这是真的,那么我不明白这个表达式是如何工作的:
x = 5 if false
如果赋值运算符具有更高的优先级,那么它应该在 if 运算符之前执行。因此,在执行之前应将 5 分配给 x if false
。
我误解了优先级吗?
我正在为 Ruby 1.8 和 1.9 阅读一本名为“The Ruby Programming Language”的书。这本书说 if-operator 的优先级低于 assignment-operator。如果这是真的,那么我不明白这个表达式是如何工作的:
x = 5 if false
如果赋值运算符具有更高的优先级,那么它应该在 if 运算符之前执行。因此,在执行之前应将 5 分配给 x if false
。
我误解了优先级吗?
较高的赋值优先级意味着您的表达式计算结果为(x = 5) if false
,而不是x = (5 if false)
。请注意,这也是一个完全有效的表达式。
是否执行每个特定子句由语言规则决定。例如,在三元运算符a ? b : c
中,只有b
orc
将被执行,但不会同时执行。
编辑
关于差异。
在x = (5 if false)
中,首先处理分配。但要完成它,我们需要赋值的左部分,即nil
,因为5 if false
计算结果为nil
。所以,表达式等价于x = nil
。
在(x = 5) if false
中,首先处理条件运算符。根据其规则,我们首先必须评估条件 ( false
)。既然是false
,那就没什么可做的了,评估的结果是nil
。
希望这很清楚。
因为<expr> if <condition>
不是一个表达式。它是 Ruby 的一种特殊语法糖。它的工作原理就像:
if <condition>
<expr>
end
其中,显然,<expr>
必须仅在之后评估,<condition>
因为<condition>
can be false
。