带括号和不带括号的方法调用的优先级是什么?

2023-11-26

以前的答案

The answer到类似的question是错的。

Ruby 中都没有提到方法调用文档也不在社区维基.

不带括号的方法调用

比......高or

or似乎比不带括号的方法调用具有较低的优先级:

puts false or true

相当于

( puts false ) or true

并显示false.

注意:我知道or不应该使用。尽管如此,它仍然是一个很好的例子,表明某些运算符的优先级确实低于方法调用。

低于||

puts false || true

相当于

puts (false || true)

并显示true.

带括号的方法调用

用于方法调用的括号似乎没有待分组:

puts(false or true)
# SyntaxError: unexpected keyword_or
puts((false or true))
#=> true

Question

带括号和不带括号的方法调用应处于此优先级中table?

赏金澄清

我正在寻找表中方法调用的确切位置。最好有例子证明它比前一个低,比下一个高。

当前的答案似乎也没有提到带括号的方法调用。

提前致谢!


Prelude

这样做的目的是测试所有可能的场景。

Note当说“操作员X比方法调用具有更高的优先级”意思是在论证中。又名:

invocation foo X bar

与(调用对象)相反

X invocation

就第二种情况而言,方法调用始终具有更高的优先级。


简短回答

它不适合:

  • 它导致SyntaxError在某些情况下
  • 它的优先级高于rescue,但低于赋值

Summary

  • not无论括号如何,都不能在方法调用后使用
  • 使用括号 (()) 方法调用有时会导致SyntaxError。这些案例是:and, or, if, unless, until, while and rescue
  • 如果括号不会导致错误,它们不会以任何方式改变优先级
  • 所有运营商,除了and, or, 后缀if, unless, until, while, rescue比方法调用具有更高的优先级

让我们尝试一下:

class Noone < BasicObject
  undef_method :!

  def initialize(order)
    @order = order
  end

  def method_missing(name, *args)
    @order << name
    self
  end
end

第一个一元:

# + and - will become binary
unary_operators = %i(! ~ not defined?)

puts 'No brackets'
unary_operators.each do |operator|
  puts operator

  order = []
  foo = Noone.new order
  bar = Noone.new order
  begin
    eval("foo.meta #{operator} bar")
  rescue SyntaxError => e
    puts e
  end
  p order
  puts '-----------'
end

puts 'Brackets'
unary_operators.each do |operator|
  puts operator

  order = []
  foo = Noone.new order
  bar = Noone.new order
  begin
    eval("foo.meta(#{operator} bar)")
  rescue SyntaxError => e
    puts e
  end
  p order
  puts '-----------'
end

获得的积分:

  • not方法调用之后是SyntaxError
  • 无论括号如何,所有一元运算符都比方法调用具有更高的优先级

现在二进制:

binary_operators = %i(
  **
  * / %
  + -
  << >>
  &
  | ^
  > >= < <=
  <=> == === =~
  .. ...
  or and
)

puts 'No brackets'
binary_operators.each do |operator|
  order = []
  foo = Noone.new order
  bar = Noone.new order
  baz = Noone.new order
  begin
    eval("foo.meta bar #{operator} baz")
  rescue SyntaxError => e
    puts e
  end
  p order
end

puts 'Brackets'
binary_operators.each do |operator|
  order = []
  foo = Noone.new order
  bar = Noone.new order
  baz = Noone.new order
  begin
    eval("foo.meta( bar #{operator} baz)")
  rescue SyntaxError => e
    puts e
  end
  p order
end

获得的积分:

  • 方法调用周围的括号and or or is a SyntaxError
  • 我们必须测试and and or进一步没有括号
  • .. and ... call <=>。我们必须进一步测试这一点
  • 我们无法通过这种方式测试其他一些二元运算符,即&&, ||, ==, !=, 修饰符rescue, if, unless, until, while
  • 除上述之外,无论括号如何,运算符都具有更高的优先级

def yes
  puts 'yes'
  true
end

def no
  puts 'no'
  false
end

def anything(arg)
  puts 'Anything'
  arg
end

anything yes and no
anything no or yes
anything yes && no
anything no || yes
anything(yes && no)
anything(no || yes)

anything yes == no
anything(yes == no)
anything yes != no
anything(yes != no)

获得的积分:

  • and and or不带括号的优先级较低
  • &&, ||, == and !=无论括号如何,都具有更高的优先级

def five(*args)
  p args
  5
end

five 2..7
five(2..7)
five 2...7
five(2...7)

获得的积分:

  • .. and ...无论括号如何,都具有更高的优先级

anything yes if no
anything(yes if no)
anything no unless yes
anything(no unless yes)

anything no until yes
anything(no until yes)
anything yes while no
anything(yes while no)

获得的积分:

  • 括号里有if, unless, until, while导致SyntaxError
  • 以上所有内容的优先级都低于不带括号的方法调用

def error
  puts 'Error'
  raise
end

anything error rescue yes
anything(error rescue yes)

获得的积分:

  • 周围的括号rescue导致SyntaxError
  • rescue如果不存在括号,则优先级较低

Ternary:

anything yes ? no : 42
anything(yes ? no : 42)

获得的积分:

  • 无论括号如何,三元具有更高的优先级

作业(留到最后,因为它发生了变化yes and no):

anything yes = no
anything(no = five(42))

获得的积分:

  • 赋值的优先级高于调用

注意+=之类的只是快捷方式+ and =所以他们表现出相同的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带括号和不带括号的方法调用的优先级是什么? 的相关文章

  • Ruby Shoes 打包程序,包括应用程序中的 Shoes

    我似乎无法让 Ruby Shoes 打包程序正确创建包含 Shoes 的 exe 我正在使用 Raisins 版本 0 r1134 并从 github 替换 pack rb 打包程序制作的 exe 都是 70 80K 文件 它们显然不包括
  • 如果 CodeIgniter 方法不存在,则重定向到默认方法。

    我正在使用 CodeignIter 并且正在寻找一种在被调用方法不存在时为单个控制器编写自定义处理例程的方法 假设你打电话www website com components login In the components控制器 没有一个方
  • Ruby Net:SSH控制大师?

    我目前有一个 Ruby Rails 应用程序 需要建立大量的短 SSH 连接 使用 Ruby Net SSH 库可以正常工作 只是每次我想发出命令时应用程序都必须登录并协商密钥 这太慢了 有没有办法使用 Ruby Net SSH 启用 Co
  • 如何在 rake 任务中包含 ActionMailer 类?

    我想在我的 rake 任务中使用 ActionMailer 以便在特定时间向人们发送电子邮件 我在 app mailers 文件夹中编写了一个邮件程序类 如下所示 class AlertsMailer lt ActionMailer Bas
  • MacOS 每秒唤醒次数错误

    构建 Rails 应用程序 ruby 2 4 0p0 Rails 5 1 4 并使用我的 Macbook Air MacOS High Sierra 10 13 2 进行本地测试 我不断遇到此问题 过去 241 秒内有 45001 次唤醒
  • 分别对用户和管理员进行身份验证

    class ApplicationController lt ActionController Base protect from forgery skip before filter authenticate user only gt w
  • Ruby 电子表格 gem,如何居中对齐数字

    我在用着http spreadsheet rubyforge org http spreadsheet rubyforge org生成电子表格 但我遇到了一些问题 我正在打开现有工作簿并向其中添加数据 我已经设法在某种程度上使数字格式正常工
  • Riod-iOS 错误:您没有写入权限“Gem::FilePermissionError”

    我已经下载了一个Riot iOS https github com vector im riot ios并遵循构建说明 当我跑步时 捆绑安装 回溯 最近一次调用 2 来自 usr bin bundle 23 in
  • 避免在 Ruby 中自动从 Fixnum 转换为 Bignum

    我正在将算法从 C 移植到 Ruby 该算法有一个方法返回一个int有时会溢出 private static int NextRandom int n return 1234567890 n 12345 该算法利用溢出来避免该函数返回的值超
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • Ruby 在带有偏移量的数组中查找

    我正在寻找一种以更简洁的方式在 Ruby 中执行以下操作的方法 class Array def find index with offset offset block offset 1 find block end end offset a
  • 回形针如何更改基本名称(文件名)?

    我正在尝试更改照片的基本名称 文件名 在我的模型中我有 attr accessor image url basename has attached file image styles gt original gt 300x250 gt pn
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • RSpec 请求规范发布一个空数组

    我目前正在 Rails 中开发 API 端点 如果我需要的数据无效 我想确保端点响应具有正确的错误状态 我需要一个 id 数组 无效值之一是空数组 Valid vendor district ids 2 4 5 6 Invalid vend
  • ||= 是什么意思? [复制]

    这个问题在这里已经有答案了 我的应用程序控制器中有一个受保护的方法 def current user current user User find by id session user id end 我想知道什么 方法 我一直在努力寻找和找
  • 有没有可以在 HTML 文档之间进行比较的 ruby​​ gem?

    事实证明 对两个不同的 html 文档进行比较是一个完全不同的问题 而不仅仅是对纯文本进行比较 例如 如果我在以下之间进行简单的 LCS 差异 Google and Google diff 结果不是 but a gt github com

随机推荐

  • 如何知道 matchTemplate 是否找到对象?

    I used this回答并编写了我自己的程序 但我有一个具体的问题 如果图像中没有物体 matchTemplate不会引发错误 而且我不知道有什么方法可以检查是否matchTemplate无论是否找到该对象 任何人都可以给我建议 或者给我
  • 使用 Axis Client API 时未调用将 HTTP 标头添加到 HTTP 请求的处理程序

    我正在使用 Axis API 访问 Axis HTTP 服务器 API的文档可以找到here 我正在使用以下代码将处理程序添加到服务器 service属于 java xml rpc Service 类型 HandlerRegistry re
  • Android:如何以编程方式访问 AVD 管理器中显示的设备序列号(API 版本 8)

    如何以编程方式访问下图中显示的值 这是硬件序列号 要访问它 安卓Q gt SDK 29 android Manifest permission READ PRIVILEGED PHONE STATE是必须的 只有系统应用程序可以需要此权限
  • 如何在Scala 3中使用akka?

    如何在 Scala 3 中使用 akka 使用 scala 3 时找不到 akka 依赖项 sbt 错误 error not found Users admin ivy2 localcom typesafe akka akka actor
  • 在 html 中以正斜杠开头,表示“href”

    我最近开始学习html 真正让我困惑的一件事是为什么有些链接在路径之前有一个正斜杠 而有些链接没有 ie vs dt a href reset index html Reset CSS a dt 一个是相对路径 一个是绝对路径 href 到
  • 使用 Proguard 删除 Google Play 服务库中未使用的类

    我正在尝试摆脱未使用的类Google Play Services图书馆 我已经创建了带有单个空活动的全新 Android 项目 该项目不使用任何来自Google Play Services图书馆 所以我希望 当我构建版本 包括在我的配置中运
  • 为特定应用打开miui省电模式

    我正在开发 VoIP 呼叫应用程序 并且当省电模式打开时 会错过通过 FCM 发送的呼叫MIUI 这种情况经常发生 我希望用户打开Battery saver activity对于我自己的应用程序 并且在省电模式中对该应用程序没有限制 For
  • 在 Node.js 中读取文件

    我对在 Node js 中读取文件感到非常困惑 fs open start html r function err fileToRead if err fs readFile fileToRead encoding utf 8 functi
  • 如何计算以GPS坐标为中心的地球上的圆上的点?

    在 KML 中画一个圆 如何获取地球上某个点的 GPS 坐标 例如以十进制格式 并生成近似于以该点为中心的圆的多边形的坐标 具有 20 多个数据点的多边形看起来像一个圆形 数据点越多 圆就越好看 我正在编写一个生成 KML 的程序 但不知道
  • 从字节数组创建私钥

    有没有办法从字节数组生成私钥 我使用 getEncoded 方法获取了这个字节数组 但现在我必须将其转换回 PrivateKey 谢谢 武克 我也在寻找这个答案 终于找到了 keyBytes 是最初使用 getEncoded 创建的字节数组
  • 在 Java FX 工作线程中不断更新 UI

    I have Label label在我的 FXML 应用程序中 我希望这个标签每秒改变一次 目前我使用这个 Task task new Task
  • 根据引用者限制对AWS S3存储桶的访问

    我试图限制对 S3 存储桶的访问 并仅允许基于引用来源的列表中的某些域 存储桶策略基本上是 Version 2012 10 17 Id http referer domain lock Statement Sid Allow get req
  • Sphinx LaTeX 标记限制

    我正在尝试在 Sphinx 版本 1 1 2 1 的多行数学模式中做三件非常基本的事情 即使在数学模式下 也将下划线写入变量名称的一部分 Use the big biggl等 构成大括号和圆括号的分隔符 并包括常规文本作为方程的一部分 请注
  • 从远程通知打开 ViewController

    当我的应用程序捕获远程通知时 我想打开 ViewController 当我收到通知时 我想打开一个 SimplePostViewController 所以这是我的 appDelegate var window UIWindow var na
  • spring data r2dbc可以生成schema吗?

    我正在使用 R2DBC 和 H2 创建一个快速项目 以熟悉这种新的反应性东西 制作了一个扩展 ReactiveCrudRepository 的存储库 只要我使用 DatabaseClient 发出与我的实体首先匹配的 CREATE TABL
  • 跨多个区域的 AppEngine 负载均衡

    据我所知 AppEngine 项目仅定义为一个区域 Google 会自动为您处理负载平衡 但是 如果我在世界各地的不同地区有应用程序 在不同的项目中 因为这似乎是一个要求 那么我如何使用 Google Cloud 中的 HTTPS 负载均衡
  • 保存 matplotlib python 函数生成的图

    我创建了一个函数 它从数据集中获取一系列值并输出一个图 例如 my plot location dataset min temperature max temperature 将返回函数中指定温度范围内的降水图 假设我想保存加利福尼亚州 6
  • Jquery UI 选项卡:关闭选项卡时如何隐藏选项卡及其相应的 div

    我使用了 Jquery UI 选项卡 并为选项卡提供了关闭选项 默认情况下 我创建三个选项卡及其相应的三个 div 现在 当我关闭选项卡时 选项卡及其 div 将被删除 我需要隐藏选项卡和 div 当我单击 添加选项卡 时 我应该只显示隐藏
  • 创建 shell 脚本以在 Linux 上运行 Java 程序

    我创建了一个同步两个目录内容的java程序 该程序将两个目录的位置作为参数来同步它们 同步信息存储在每个目录内的 JSON 格式文件中 我有一个参考库json simple 1 1 1 jar 我在 Windows 上从 Eclipse 运
  • 带括号和不带括号的方法调用的优先级是什么?

    以前的答案 The answer到类似的question是错的 Ruby 中都没有提到方法调用文档也不在社区维基 不带括号的方法调用 比 高or or似乎比不带括号的方法调用具有较低的优先级 puts false or true 相当于 p