Идиоматическое использование скобок в Ruby - PullRequest
16 голосов
/ 10 октября 2011
array.include? 'foo' or array.include? 'bar'

- синтаксическая ошибка (неожиданное ключевое слово_или). Скобки решают проблему, но поскольку я новичок в Ruby, я не знаю, что из следующего считается более идиоматическим:

Вариант 1

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

Вариант 2

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

Это сводится к личным предпочтениям, или один подход считается более "правильным"?

Ответы [ 4 ]

25 голосов
/ 10 октября 2011

Я бы посоветовал вам взглянуть на руководство по стилю программирования Ruby , особенно здесь, раздел Синтаксис .

Опускайте скобки вокруг параметров для методов, которые являются частью внутреннего DSL (например, Rake, Rails, RSpec), методов со статусом «ключевое слово» в Ruby (например, attr_reader, put) и методов доступа к атрибутам.Используйте круглые скобки вокруг аргументов всех других вызовов методов.- выдержка из руководства

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)
3 голосов
/ 10 октября 2011

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

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

Надеюсь, это поможет.

3 голосов
/ 10 октября 2011

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

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

array.include?('foo') || array.include?('bar')
2 голосов
/ 10 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...