我的问题是由触发这在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)时。
赋值运算符中必须有一些特殊规则,我在我检查过的文档中没有找到,特别是赋值和语法的文档。
有人可以指出,赋值运算符的这种特殊行为记录在哪里吗?或者我在这里错过/误解了什么?
来自文档:https ://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign
赋值表达式用于将对象分配给变量等。赋值有时充当局部变量或类常量的声明。赋值表达式的左侧可以是:
变量 变量 `=' 表达式
右边有一个表达式,所以表达式的结果赋给变量。
因此,您应该在遵循优先级之前查找表达式 (*)。
1 && a = 3基本上是两个“链式”表达式:
3和1 && 3
也许它更具可读性:
1 && a = 3 + 4表达式在3 + 4和 的位置1 && 7,请参阅:
1 && a = 3 + 4 #=> 7
1 && 7 #=> 7
res = 1 && a = 3 + 4
res #=> 7
Run Code Online (Sandbox Code Playgroud)
(*) 优先级表还有助于查找表达式(在链接文档的运算符表达式段落中查找优先级表):
表中上面的内容=“形成”要由 赋值的表达式=,而下面的内容则不是。
例如:
1 + 3 and 2 + 4 #=> 4
a = 1 + 3 and b = 2 + 4 #=> 4
(a = 1 + 3) and (b = 2 + 4) #=> 4
a = (1 + 3 and b = 2 + 4) #=> 6
Run Code Online (Sandbox Code Playgroud)
您还可以根据优先级表检查这些示例:
1 && 3 #=> 3
1 && a = 3 #=> 3
a #=> 3
3 and 1 #=> 3
3 and b = 1 #=> 3
b #=> 1
2 ** c = 2 + 1 #=> 8
c #=> 3
d = 2 ** 3
d #=> 8
e = 3
e **= 2
e #=> 9
Run Code Online (Sandbox Code Playgroud)