赋值运算符真的“只是”一个运算符吗?

use*_*428 9 ruby syntax

我的问题是由触发在SO讨论,这并没有导致一个答案,将真正说明问题。我在这里以稍微不同的方式“重写”它,因为我想更清楚真正的问题是什么,因此希望在这里得到答案。

考虑以下两个 Ruby 表达式:

  1. 1 * a - 3
  2. 1 && a = 3

从 Ruby 优先级表中,我们知道这里提到的运算符*的优先级最高,其次是-,然后是&&,最后是=

表达式没有括号,但是——正如我们可以在irb 中验证的那样,a在第一种情况下提供一个合适的值——它们被评估,就像括号分别写为(1*a) - 3, 一样1 && (a=3)

第一个很容易理解,因为*绑定比-.

第二个不能这样解释。&&绑定强于=,因此如果仅优先级很重要,则解释应为(1 && a) = 3

结合性(=右结合和-左结合)也不能解释这种效果,因为只有当我们有几个相同类型的运算符(例如x-y-zx=y=z)时。

赋值运算符中必须有一些特殊规则,我在我检查过的文档中没有找到,特别是赋值语法的文档

有人可以指出,赋值运算符的这种特殊行为记录在哪里吗?或者我在这里错过/误解了什么?

iGi*_*ian 2

来自文档:https ://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign

赋值表达式用于将对象分配给变量等。赋值有时充当局部变量或类常量的声明。赋值表达式的左侧可以是:

变量 变量 `=' 表达式

右边有一个表达式,所以表达式的结果赋给变量

因此,您应该在遵循优先级之前查找表达式 (*)

1 && a = 3基本上是两个“链式”表达式:

31 && 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)