在Ruby中使用括号的习惯用法

时间:2011-10-10 01:12:00

标签: ruby parentheses idiomatic

array.include? 'foo' or array.include? 'bar'

是语法错误(意外的keyword_or)。圆括号解决了这个问题,但由于我是Ruby的新手,我不知道以下哪一个被认为更具惯用性:

选项1

array.include?('foo') or array.include?('bar')

选项2

(array.include? 'foo') or (array.include? 'bar')

这取决于个人偏好,还是一种方法被认为更“正确”?

4 个答案:

答案 0 :(得分:24)

我建议您查看community-driven Ruby coding style guide,特别是Syntax部分。

省略了作为内部DSL(例如Rake,Rails,RSpec)一部分的方法的参数的括号,在Ruby中具有“关键字”状态的方法(例如attr_reader,puts)和属性访问方法。在所有其他方法调用的参数周围使用括号。 - 摘自指南

class Person
  attr_reader :name, :age

  # omitted
end

temperance = Person.new('Temperance', 30)
temperance.name

puts temperance.age

x = Math.sin(y)
array.delete(e)

答案 1 :(得分:3)

你确定失败了吗?你最初的例子对我来说很好。

ruby-1.9.2-p290 :002 > array = ['bar']
 => ["bar"] 
ruby-1.9.2-p290 :003 > array.include? 'foo' or array.include? 'bar'
 => true

事实上,如果任何事情都可以被认为是惯用的,那就是那个。 or的低优先级允许在您离开Parens时工作。这个特性应该使它成为Ruby的惯用语(甚至是Perl,or是暂缓的。)

选项1非常明确,但考虑到你包含了parens,你真的没有必要使用or。使用||可能更好,它与其他运算符一样具有高优先级,并且更常见。我认为使用or看起来像英语并不是一个好习惯。它在语言中具有语义含义,可能最适合用于那些品质。

选项2当然很愚蠢。如果你要包括parens,你也可以使用它们作为方法签名。

希望这有帮助。

答案 2 :(得分:3)

Avdi Grimm认为you shouldn't使用andor作为布尔逻辑。您应该只有andor用于控制流程(类似于ifunless

根据他的建议,您应该使用||代替:

array.include?('foo') || array.include?('bar')

答案 3 :(得分:2)

选项1是首选,因为它也适用于其他语言。选项2看起来像LISP,现在不流行。