Идиоматическое использование скобок в Ruby

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 ответов


Я бы предложил вам взглянуть на руководство по стилю кодирования 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)

вы уверены, что это сбой? Ваш первоначальный пример отлично работает для меня.

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, конечно, глупо. Если вы собираетесь включить parens, вы можете также использовать их для подписи метода.

надеюсь, что это помогает.


Вариант 1 предпочтителен, так как он также является общим для других языков. Вариант 2 выглядит как LISP, который в настоящее время не популярен.


авди Гримм считает не стоит использовать and или or для булевой логики. Вы должны только and или or для потока управления (аналогично if или unless)

по его рекомендации, вы должны использовать || вместо:

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