ruby中优先级和/或方法参数的优先级

时间:2015-01-22 18:59:00

标签: ruby operator-precedence

以下是两项测试:

if [1,2,3,4].include? 2 && nil.nil?
  puts :hello
end
#=>

if [1,2,3,4].include?(2) && nil.nil?
  puts :hello
end
#=> hello

上面告诉我&&的优先级高于方法参数,所以逻辑上和2 && nil.nil?是真的,并将其作为参数传递给包含?。

然而,有这个测试:

if [1,2,3,4].include? 2 and nil.nil?
  puts :hello
end
#=> hello

所以这告诉我方法参数和'and'具有相同的优先级(或方法args高于'and'),因为它传递2包含?在它处理'和'之前。

注意:我了解&&and具有不同的优先级。问题不是关于这个,而是关于andor与ruby方法的参数。

我找不到证实这一点的文件。例如,这根本没有提到方法参数:http://phrogz.net/programmingruby/language.html#table_18.4http://romhack.wikia.com/wiki/Ruby_operators

有人可以解释这种行为吗?也就是说,ruby如何知道将值作为参数传递给方法与流程操作符?

2 个答案:

答案 0 :(得分:1)

正如您所说&&and具有不同的优先级,但是对以下示例的解释如下:

if [1,2,3,4].include? 2 and nil.nil?
  puts :hello
end
#=> hello

and的绑定强度,您可以在此处阅读: Difference between "and" and && in Ruby?

这基本上解释了2 and nil.nil?将被评估为nil,但是它会返回2,如下例所示:

foo = :foo
bar = nil

a = foo and bar
# => nil
a
# => :foo

a = foo && bar
# => nil
a
# => nil

答案 1 :(得分:0)

我从来没有见过任何关于方法参数优先级的文档,但是我在查看方法参数时使用的一条经验法则是在参数中尽可能精神上剥离空格并且仍然具有相同的表达式。这通常给我优先权:

[1,2,3,4].include? 2&&nil.nil?是相同的表达式,但是你不能删除空格 [1,2,3,4].include? 2 and nil.nil?因此,优先权从左到右...... I.e。方法参数是2。

无论如何,更好的问题是为什么你会写这样的陈述?

省略方法括号仅对代码可读性有用。但是,您的陈述几乎不可读,并且会对代码进行一次暂停,并且比他应该更多地考虑它。如果我要审查这样的代码,由于可读性差,我肯定会失败代码审查。

事实上,许多样式指南明确指出大多数带参数的方法都应该用括号括起来(这甚至是一个单词;)。例如: Ruby style guide