ruby方法调用的优先级是什么?

http://phrogz.net/programmingruby/language.html#table_18.4上面链接提供的表格仅给出了ruby运算符的优先级。 方法的优先级是什么(或者我应该说:消息/函数)?

例如,当我在irb中输入如下内容时

Math.sqrt 2 + 2 

结果得到了2.0。 如果没有明确的优先规则,我就无法决定在哪里使用parens以及在哪里省略它们。 所以,有人请帮助我摆脱这种不确定性。 提前致谢!

任何运算符都优先于方法调用。 强烈建议使用()进行方法调用,以避免出现类似于您所询问的情况。

Ruby方法调用的优先级低于任何运算符,但这不是完整的故事 – 有一些边缘情况是非显而易见的。 你的问题让我对其中一个感到好奇,所以我在ruby-talk邮件列表上问了一下 。 您应该会发现生成的主题很有帮助。

另外,请阅读此博客文章 ,以获得一个很好的论据,即您应该自由地使用括号,尤其是在您学习ruby时。

在Ruby中,任何运算符都优先于方法调用,例如首先计算运算符。

然而,示例Math.sqrt 2 + 2很好地说明了如何难以阅读和不直观的遗漏括号。 人们可能期望在这里评估Math.sqrt(2) + 2

当你遇到这样一条线时,你可能会想:编码器打算做什么? 这是一个错误吗?

尽可能使用括号总是一个好主意,以明确你想要的东西,特别是当有方法调用或多个操作符时 – 它只是好的风格,风险最低的方法(例如不做假设,但是通过使用括号使自己清楚)。

在表达式中添加额外的括号永远不会伤害,但是将它们排除可能会受到很大的伤害。

这是我最近遇到的一个很好的例子:

  def foo(arg) raise "error" end x = foo 4 rescue 7 x => nil # oops! x = foo(4) rescue 7 x => 7 

我希望这很好地说明了为什么使用括号很重要

也:

点击此处,在“调用方法”下: http : //ruby-doc.org/docs/ProgrammingRuby/html/tut_methods.html Quote:

[…]如果没有歧义,你可以在调用方法时省略参数列表周围的括号。[…] 但是,除了最简单的情况我们不建议这样做 – 有一些微妙的问题可能会让你失望。[特别是,你必须在方法调用上使用括号,它本身是另一个方法调用的参数(除非它是最后一个参数)。] 我们的规则很简单:如果有任何疑问,请使用括号。

另见: http : //phrogz.net/programmingruby/language.html

我们可以使用您的Programming Ruby链接作为起点,并自己发现未加密码的方法调用属于优先级表。 我只会展示确定位置的最终测试。

它低于defined?

 defined? Math.sqrt 2 # => SyntaxError: unexpected tINTEGER, expecting end-of-input 

啊哈,它高于not

 not Math.sqrt 2 => false 

现在您确切知道何时应该使用括号。

边注

(感谢Martin Demello链接到ruby-talk提醒我)

请记住,表中的运算符仅在未在方法调用语法中使用时才适用。 示例 – 以下内容不遵守*+的规则,因为它们不是用作运算符,而是方法:

 # This happens because unparenthesized method calls are right-associative. 2.* 5.+ 2 # => 14 

如果这看起来令人困惑,那么同样的事情发生在这里:

 # The `modulo` is evaluated first because it's on the right Math.sqrt 9.modulo 5