【发布时间】:2020-08-13 08:19:58
【问题描述】:
我的问题是由this 关于 SO 的讨论引发的,但并未得出能够真正解释问题的答案。我在这里以稍微不同的方式“重写”它,因为我想更清楚真正的问题是什么,因此希望在这里得到答案。
考虑以下两个 Ruby 表达式:
1 * a - 31 && a = 3
从 Ruby 优先级表中,我们知道这里提到的运算符中,* 的优先级最高,其次是 -,然后是 &&,最后是 =。
表达式没有括号,但是 - 正如我们可以在 irb 中验证的那样,在第一种情况下为 a 提供合适的值 - 它们被评估为好像括号被写为(1*a) - 3,分别为1 && (a=3)。
第一个很容易理解,因为*的绑定比-强。
第二个不能这样解释。 && 的绑定比 = 强,所以如果只考虑优先级,解释应该是 (1 && a) = 3。
关联性(= 是右关联的,- 是左关联的)也无法解释这种影响,因为关联性仅在我们有多个相同类型的运算符时才重要(例如 x-y-z 或x=y=z)。
赋值运算符中必须有一些特殊规则,我在我检查的文档中没有找到,特别是 assignment 和 syntax 的文档。
有人可以指出,赋值运算符的这种特殊行为记录在哪里?还是我在这里错过/误解了什么?
【问题讨论】:
-
你也可以开始赏金。
-
我会考虑将其用于 this 问题,但必须等到它有资格获得赏金。我觉得原始问题的表述(不是我撰写的)并没有把问题带到重点。在我的重写中,我试图专注于最简单可重现的例子。
-
在 SO 上阅读this question 的答案,似乎给出了答案。综上所述,赋值的左端有特定的允许值,所以本例中不应用优先规则。