Разница между "или" и ||в рубине? - PullRequest
162 голосов
/ 18 января 2010

В чем разница между операторами or и || в Ruby? Или это просто предпочтение?

Ответы [ 8 ]

213 голосов
/ 18 января 2010

Это вопрос приоритета оператора.

|| имеет более высокий приоритет, чем or.

Таким образом, между ними у вас есть другие операторы, включая троичные (? :) и присваивание (=), поэтому выбранный вами способ может повлиять на результат операторов.

Вот таблица приоритетов оператора ruby ​​.

См. thisвопрос для другого примера использования and / &&.

Кроме того, помните о некоторых неприятных вещах, которые могут произойти:

a = false || true  #=> true
a  #=> true

a = false or true  #=> true
a  #=> false

Оба предыдущих утверждения оцениваютtrue, но второй устанавливает a на false, поскольку приоритет = ниже ||, но выше or.

72 голосов
/ 18 января 2010

Как уже объяснили другие, разница только является приоритетом. Тем не менее, я хотел бы отметить, что на самом деле два различия между ними:

  1. and, or и not имеют намного меньший приоритет, чем &&, || и !
  2. and и or имеют такой же приоритет , в то время как && имеет более высокий приоритет, чем ||

Как правило, рекомендуется избегать использования and, or и not и использовать вместо них &&, || и !. (Разработчики ядра Rails, например, отклоняют патчи, которые используют формы ключевых слов вместо форм операторов.)

Причина, по которой они вообще существуют, не для булевых формул, а для потока управления. Они проникли в Ruby через хорошо известную идиому Perl do_this or do_that, где do_this возвращает false или nil, если есть ошибка, и только тогда выполняется do_that. (Аналогично, есть и идиома do_this and then_do_that.)

Примеры:

download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache

Иногда это может сделать поток управления немного более плавным, чем при использовании if или unless.

Легко понять, почему в этом случае операторы имеют «неправильный» (т. Е. Идентичный) приоритет: они все равно никогда не отображаются вместе в одном и том же выражении. И когда они do появляются вместе, вы обычно хотите, чтобы их оценивали просто слева направо.

38 голосов
/ 09 апреля 2014

и / или предназначены для управления потоком.

Ruby не допустит этот синтаксис в качестве допустимого:

false || raise "Error"

Однако это действительно:

false or raise "Error"

Вы можете выполнить первую работу с помощью (), но использование or является правильным методом.

false || (raise "Error")
11 голосов
/ 03 июня 2016

puts false or true -> отпечатки: ложь

puts false || true -> отпечатки: true

9 голосов
/ 19 июля 2015

Как я использую эти операторы:

||, && для логической логики. or, and для контроля потока. Э.Г.

do_smth if may_be || may_be - мы оцениваем состояние здесь

do_smth or do_smth_else - мы определяем рабочий процесс, который эквивалентен do_smth_else unless do_smth

, чтобы привести простой пример:

> puts "a" && "b" b

> puts 'a' and 'b' a

Хорошо известная идиома в Rails - render and return. Это ярлык для return if render, в то время как render && return не будет работать (см. Rails документация )

2 голосов
/ 12 марта 2014

или НЕ совпадает с ||

Использовать только ||оператор вместо или оператор.

Причины:

  • или оператор имеет более низкий приоритет, чем ||
  • или имеют меньший приоритет, чем = оператор присваивания
  • и и или имеют тот же приоритет, а && имеет более высокий приоритет, чем ||
1 голос
/ 13 марта 2014

Оба "или" и "||"оценивать как истинное, если любой из операндов является истинным.Они оценивают свой второй операнд, только если первый является ложным.

Как и в случае с «и», единственная разница между «или» и «||»это их приоритет.

Просто чтобы сделать жизнь интересной, «и» и «или» имеют одинаковый приоритет, в то время как «&&» имеет более высокий приоритет, чем «||».

0 голосов
/ 18 января 2010

Просто чтобы добавить к ответу Мопока, это также вопрос семантики. or считается хорошей практикой, потому что читается намного лучше, чем ||.

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