http://phrogz.net/programmingruby/language.html#table_18.4提供的表格只显示了Ruby运算符的优先级。那么方法(或者说:消息/函数)的优先级是什么呢?
例如,在irb中输入以下内容:
例如,在irb中输入以下内容:
Math.sqrt 2 + 2
我得到了2.0作为结果。没有确定的优先级规则,我就不能决定在哪里使用圆括号,在哪里省略它们。因此,有人请帮助我消除这种不确定性。谢谢!
Math.sqrt 2 + 2
我得到了2.0作为结果。没有确定的优先级规则,我就不能决定在哪里使用圆括号,在哪里省略它们。因此,有人请帮助我消除这种不确定性。谢谢!
()
来进行方法调用,以避免出现您所询问的情况。defined?
的优先级低:defined? Math.sqrt 2
# => SyntaxError: unexpected tINTEGER, expecting end-of-input
not Math.sqrt 2
=> false
# 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
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 引用:
[...] 如果没有歧义,当调用方法时可以省略参数列表周围的括号。[...] 但是,在除了最简单的情况之外,我们不推荐这样做 ---有一些微妙的问题可能会绊倒您。[特别是,必须在另一个方法调用的参数上使用括号(除非它是最后一个参数)。]我们的规则很简单:如果有任何疑问,请使用括号。
Math.sqrt 2 + 2
被解释为 Math.sqrt(2 + 2)
。而且我非常怀疑省略括号是因为“懒惰”的结果。你也没有真正回答问题,而是通过简单地说要始终使用括号来回避它。 - Andrew Marshall&&
和 ||
具有相同的优先级,我希望第一个语句从左到右进行计算,即 (true || true) && false
,结果为 false
。而且第二个语句表明 true || (true && false)
是 false
,但实际上它是 true
。 - nickgrim
puts false or true
会显示false
,而puts false || true
则会显示true
。 - Eric Duminil