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

2024-03-11

我的问题是由this https://stackoverflow.com/questions/63228851/does-assignment-precede-logical-operator-in-ruby/63230036?noredirect=1#comment112001190_63230036关于 SO 的讨论,并没有得出真正解释问题的答案。我在这里以稍微不同的方式“重写”它,因为我想让它更清楚真正的问题是什么,因此希望在这里得到答案。

考虑以下两个 Ruby 表达式:

  1. 1 * a - 3
  2. 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(使用前将#替换为@)

赋值运算符真的“只是”一个运算符吗? 的相关文章

随机推荐

  • IntelliJ IDEA 中的 JSP 调试

    有谁知道如何调试JSP in IntelliJ IDEA 当我在我的中设置断点时JSP文件中 这些断点似乎从未生效 调试器永远不会碰到它们 IDEA 似乎认为断点是有效的 我确实看到一个红点放置在我放置断点的行的左侧 我在 IntelliJ
  • Apache Thrift 中的对称加密 (AES)

    我有两个使用 Thrift 进行交互的应用程序 他们共享相同的密钥 我需要加密他们的消息 使用对称算法 例如 AES 是有意义的 但我还没有找到任何库来执行此操作 所以我做了一个研究并看到了以下选项 使用内置 SSL 支持 我可以使用内置的
  • 在 python 中查找并替换多个值

    我想查找一维数组 列表中的多个值并将其替换为新值 以列表为例 a 2 3 2 5 4 4 1 2 我想更换 val old 1 2 3 4 5 with val new 2 3 4 5 1 因此新数组是 a new 3 4 3 1 5 5
  • 覆盖 Eclipse 中的重命名操作

    I am new to eclipse plugin development I am in the need of overriding the rename dialog for the files in a specific cust
  • 管理二进制版本

    我正在寻找有关如何管理共同构成发行版本的二进制文件工件的工具和建议 该项目如下所示 Package Version Component A Version Component B Version Component C Version 可能
  • Laravel 4 - 验证器 - 文件大小

    只是询问有关 Laravels 验证器的问题 我网站的用户有时会上传大约 100MB 的文件 我看过 http laravel com docs 4 2 validation http laravel com docs 4 2 valida
  • 如何创建固定结构的对象?

    我的揭示模块中有以下代码 但我不确定如何声明 定义imageListItem 这严格来说是一个 DTO 并不真正需要任何信息隐藏 我是否正确定义了这个对象 var imageListItem function var title Objec
  • Gorilla Sessions - 如何根据请求自动更新 Cookie 过期时间?

    我知道许多其他语言和 Web 框架会在每次通过后端访问会话 或类似的操作 时自动将 cookie 的过期时间更新为会话超时 我不相信 Gorilla 提供这个实用程序 我正在考虑编写一些请求中间件 如果它检测到有效会话 将延长 cookie
  • jQuery 事件未触发

    我一直在努力让它发挥作用 基本上我有一个搜索框 其中有一个默认字符串 即搜索 当用户单击输入字段时它应该消失 这是代码 HTML
  • 构建 MAUI Android 失败

    我创建了一个全新的 MAUI 应用程序 我必须创建一个新应用程序 因为当我升级 Visual Studio 预览版时 我使用预览版本创建的先前应用程序无法工作 这个应用程序使用 prism maui 这应该没有任何区别 我还使用使用预览版本
  • 即使明确设置,PreparedStatement 也不会超时

    我正在尝试模拟一个场景 其中我的服务失去与数据库的连接并且无法执行INSERT通过阻止与 iptables 的连接 但我无法使executeQuery 方法超时 我所做的是为PreparedStatement设置一个超时 如下所示state
  • 如何复制cmake目标

    我正在我的 cmake 项目中编写函数 该函数需要从一个目标创建两个目标 并稍微更改其中之一 option BORG STRIP TEST BINARIES OFF Strip symbols from test binaries to r
  • 从旧的 Subversion 备份中恢复文件

    我有一个来自旧的颠覆服务器的 tar 备份 该服务器早已失效 该服务器管理的所有源代码都是遗留代码 永远不会再需要 除了这个项目 tar 文件充满了小目录 如 conf dav db 有没有办法从这个备份中提取单个项目的最终源代码 您只需从
  • 在 Laravel 中如何在查询中不带参数的 groupBy Url

    下面的查询包含大量连接表和 DB raw 查询 它按预期工作 我想 groupBy 一个 landing 它是表中存储 URL 的字段 但我想对不带参数的 URL 进行分组 我怎样才能实现这个目标 下面的查询尝试使用 SUBSTRING I
  • 如何在反应导航6中分别处理两个抽屉?

    我创建了两个抽屉导航器 const MenuDrawerRight createDrawerNavigator const MenuDrawerLeft createDrawerNavigator function RightDrawerS
  • FluentNHibernate 和枚举

    我有一个名为 Permissions 的枚举 可以为用户分配权限 或者可以将权限分配给角色并为用户指定角色 用户和角色都有这样的属性 public virtual IList
  • Python SQLite - 慢速更新记录

    我有一个脚本 可以将数据库中存储的日期从 Unix 时间 纪元 转换为人类可读的格式 有30 000条记录 从数据库中提取数据 转换数据并将其打印到屏幕上的速度非常快 然而 从数据库中提取数据 转换数据并执行 更新 语句来更新记录的速度非常
  • 序列化为 json 响应时避免 hibernate 延迟初始化异常的更好方法

    这是参考中的我一个月前问的一个问题 https stackoverflow com questions 13354766 avoid hibernate lazy initialization exception 在这个问题中 https
  • 使用 Laravel 邮件类时如何设置 SwifMailer 插件?

    Laravel 不会返回任何有用的信息来显示电子邮件失败的原因 斯威夫邮递员记录器插件 http swiftmailer org docs plugins html logger plugin有助于发送过程中的调试 当通过 Laravel
  • 赋值运算符真的“只是”一个运算符吗?

    我的问题是由this https stackoverflow com questions 63228851 does assignment precede logical operator in ruby 63230036 noredire