http://phrogz.net/programmingruby/language.html#table_18.4 上面链接提供的表仅给出了ruby运算符的优先级。方法的优先级是什么(或者我应该说:消息/函数)?
例如,当我在irb
中输入如下内容时Math.sqrt 2 + 2
我的结果是2.0。如果没有明确的优先规则,我就无法决定在哪里使用parens以及在哪里省略它们。所以,有人请帮助我摆脱这种不确定性。提前谢谢!
答案 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 引用:
[...]如果没有 模糊性你可以省略参数列表周围的括号 调用方法。[...] 但是,除了最简单的情况我们不这样做 推荐这个 ---有一些微妙的问题会让你感到沮丧 [特别是,您必须在方法调用上使用括号 本身是另一个方法调用的参数(除非它是最后一个 参数)。] 我们的规则很简单:如果有任何疑问,请使用 括号中。强>
答案 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