我的问题是由this https://stackoverflow.com/questions/63228851/does-assignment-precede-logical-operator-in-ruby/63230036?noredirect=1#comment112001190_63230036关于 SO 的讨论,并没有得出真正解释问题的答案。我在这里以稍微不同的方式“重写”它,因为我想让它更清楚真正的问题是什么,因此希望在这里得到答案。
考虑以下两个 Ruby 表达式:
1 * a - 3
1 && a = 3
从 Ruby 优先级表中,我们知道这里提到的运算符中,*
优先级最高,其次是-
,然后由&&
最后由=
.
表达式没有括号,但是 - 正如我们可以验证的那样irb,提供合适的值a
在第一种情况下 - 它们的评估就像括号被写成(1*a) - 3
, 分别1 && (a=3)
.
第一个很容易理解,因为*
结合力强于-
.
第二个就不能这样解释了。&&
结合力强于=
,因此,如果仅考虑优先级,则解释应该是(1 && a) = 3
.
结合性(=
是右结合的并且-
是左关联)也无法解释这种效果,因为只有当我们有多个相同类型的运算符(例如x-y-z
or x=y=z
).
赋值运算符中一定有一些特殊的规则,我在我检查的文档中没有找到,特别是文档任务 https://ruby-doc.org/core-2.7.1/doc/syntax/assignment_rdoc.html and syntax https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign.
有人可以指出,赋值运算符的这种特殊行为记录在哪里吗?或者我在这里错过/误解了什么?
来自文档:https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign
赋值表达式用于将对象分配给变量等。赋值有时充当局部变量或类常量的声明。赋值表达式的左侧可以是:
变量
变量“=”表达式
右边有一个表达式,所以表达式的结果赋给变量.
So, 您应该在遵循优先级之前查找表达式 (*).
1 && a = 3
基本上是两个“链式”表达式:
3
and 1 && 3
也许它更具可读性:1 && a = 3 + 4
表达式在哪里3 + 4
and 1 && 7
, see:
1 && a = 3 + 4 #=> 7
1 && 7 #=> 7
res = 1 && a = 3 + 4
res #=> 7
(*) 优先级表还有助于查找表达式(在链接文档中查找优先级表运算符表达式段落):
上面是什么=
在表“forms”中要分配的表达式=
,下面的内容则不然。
例如:
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
您还可以根据优先级表检查这些示例:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)