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