Идиоматическое использование круглых скобок в Ruby
array.include? 'foo' or array.include? 'bar'
- синтаксическая ошибка (неожиданное ключевое слово_or). Круглые скобки решают проблему, но поскольку я новичок в Ruby, я не знаю, какое из следующего считается более идиоматичным:
Вариант 1
array.include?('foo') or array.include?('bar')
Вариант 2
(array.include? 'foo') or (array.include? 'bar')
Это относится к личным предпочтениям или один подход считается более "правильным"?
Ответы
Ответ 1
Я бы посоветовал вам взглянуть на руководство по стилю Ruby для сообщества, здесь, в частности, раздел 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)
Ответ 2
Вы уверены, что это не удается? Ваш первоначальный пример отлично подходит для меня.
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 очень понятен, но учитывая, что вы включили парнеры, вам действительно не нужно использовать or
. Вероятно, лучше использовать ||, который имеет высокий приоритет, как и другие операторы, и является более распространенным явлением. Я думаю, что использование or
для этого похоже на английский, не является большой практикой. Он имеет семантический смысл в языке и, вероятно, лучше всего используется для этих качеств.
Вариант 2 - глупо, конечно. Если вы собираетесь включить parens, вы можете также использовать их для подписи метода.
Надеюсь, что это поможет.
Ответ 3
Вариант 1 является предпочтительным, поскольку он является общим для других языков. Вариант 2 выглядит как LISP, который сегодня не пользуется популярностью.
Ответ 4
Avdi Grimm считает , что вы не должны использовать and
или or
для логической логики. Для потока управления вы должны использовать and
или or
(аналогично if
или unless
)
В соответствии с его рекомендацией вместо ||
следует использовать ||
:
array.include?('foo') || array.include?('bar')