21
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

4 回答 4

27

我建议你看看社区驱动的 Ruby 编码风格指南,这里特别是语法部分。

省略作为内部 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)
于 2011-10-10T05:25:43.990 回答
4

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

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

事实上,如果有什么可以被认为是惯用的,那就是那个。当您关闭括号时,低优先级or允许此操作。这个特性应该使它对 Ruby(甚至是 Perl,它or是一个保留的)来说是惯用的。

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

选项2当然是愚蠢的。如果要包含括号,则不妨将它们用于方法签名。

希望这可以帮助。

于 2011-10-10T02:05:48.380 回答
4

Avdi Grimm 认为您不应该andoror用于布尔逻辑。您应该只使用andoror来控制流(类似于ifor unless

根据他的建议,您应该||改用:

array.include?('foo') || array.include?('bar')
于 2011-10-10T02:07:10.583 回答
2

选项 1 是首选,因为它对其他语言也很常见。选项 2 看起来像现在不流行的 LISP。

于 2011-10-10T01:47:21.363 回答