在以下示例中,我无法理解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
,但它是如此意外,我无法理解具体的作业规则。
答案 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时,方程式被分成左侧和右侧(方程式),然后根据顺序进行评估操作。