理解Ruby中赋值和逻辑运算符的优先级

时间:2016-01-07 16:52:39

标签: ruby grammar abstract-syntax-tree

在以下示例中,我无法理解Ruby运算符的优先级:

x = 1 && y = 2

由于&&的优先级高于=,因此我的理解与+*运算符类似:

1 + 2 * 3 + 4

解析为

1 + (2 * 3) + 4

它应该等于:

x = (1 && y) = 2

但是,所有Ruby源代码(包括内部语法分析器Ripper)都将其解析为

x = (1 && (y = 2))

为什么?

编辑[08.01.2016]

让我们关注子表达式:1 && y = 2

根据优先规则,我们应该尝试将其解析为:

(1 && y) = 2

这没有意义,因为=需要特定的LHS(变量,常量,[]数组项等)。但由于(1 && y)是一个正确的表达式,解析器应如何处理它?<​​/ p>

我已经尝试过咨询Ruby的parse.y,但它是如此意外,我无法理解具体的作业规则。

2 个答案:

答案 0 :(得分:2)

简单。 Ruby只能以有意义的方式解释它。 =是作业。在你的期望:

x = (1 && y) = 2

将某些内容分配给1 && y是没有意义的。您只能将某些内容分配给变量或常量。

请注意,优先规则的目的是消除模糊表达的歧义。如果解释它的一种方法没有意义,那么就没有必要消除歧义,因此优先规则不会生效。

答案 1 :(得分:0)

我的理解是在

的情况下
x = 1 && y = 2

首先解析逻辑AND 。 AND然后被迫评估它的左侧和右侧。在评估中,左侧发生第一次分配,然后在右侧评估中,第二次分配也相同。出于这个原因,在以下情况下:

x = false && y = 2

永远不会分配“y”。 AND被命中,迫使x赋值进行求值,但从不打扰运行y赋值,因为AND无需实现其目的。

换句话说,解析器再次简单地根据我的理解,足够聪明地认识到在运行AND时,方程式被分成左侧和右侧(方程式),然后根据顺序进行评估操作。