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

时间:2011-10-11 06:53:29

标签: ruby operator-precedence

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

例如,当我在irb

中输入如下内容时
Math.sqrt 2 + 2

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Ruby方法调用的优先级低于任何运算符,但这不是完整的故事 - 有些边缘情况不明显。你的问题让我对其中一个感到好奇,所以我asked on the ruby-talk mailing list。您应该会发现生成的主题很有帮助。

另外,read this blog post是一个很好的论据,你应该自由地使用括号,特别是当你学习红宝石时。

答案 2 :(得分:1)

在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 引用:

  

[...]如果没有   模糊性你可以省略参数列表周围的括号   调用方法。[...] 但是,除了最简单的情况我们不这样做   推荐这个 ---有一些微妙的问题会让你感到沮丧   [特别是,您必须在方法调用上使用括号   本身是另一个方法调用的参数(除非它是最后一个   参数)。] 我们的规则很简单:如果有任何疑问,请使用   括号中。

另请参阅:http://phrogz.net/programmingruby/language.html

答案 3 :(得分:0)

我们可以使用您的编程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