Какая разница между операторами or и || в Ruby? Или это просто предпочтение?
Разница между "или" и || в Рубине?
Ответ 1
Это вопрос операторского приоритета.
|| имеет более высокий приоритет, чем or.
Таким образом, между ними у вас есть другие операторы, включая троичные (? : :) И присваивание (=), поэтому выбор одного из них может повлиять на результат операторов.
Здесь таблица приоритетов оператора ruby.
Посмотрите этот вопрос для другого примера использования and/&&.
Также помните о некоторых неприятных вещах, которые могут произойти:
a = false || true #=> true
a #=> true
a = false or true #=> true
a #=> false
Оба из предыдущих двух утверждений оцениваются как true, но второе устанавливает a в false поскольку = приоритет меньше, чем || но выше or.
Ответ 2
Как уже объясняли другие, единственная разница - это приоритет. Однако я хотел бы отметить, что между ними существуют две отличия:
-
and,orиnotимеют гораздо более низкий приоритет, чем&&,||и! -
andиorимеют одинаковый приоритет, а&&имеет более высокий приоритет, чем||
В общем, это хороший стиль, чтобы избежать использования and, or и not и вместо этого использовать &&, || и !. (Основные разработчики Rails, например, отклоняют патчи, которые используют формы ключевых слов вместо форм оператора.)
Причина, по которой они существуют вообще, не для булевых формул, а для потока управления. Они пробились в Ruby через хорошо известную do_this or do_that идиому Perl, где 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.
Легко понять, почему в этом случае у операторов есть "неправильный" (т.е. одинаковый) приоритет: они никогда не появляются вместе в одном выражении. И когда они появляются вместе, вы обычно хотите, чтобы их оценивали просто слева направо.
Ответ 3
и/или для потока управления.
Ruby не позволит использовать это как допустимый синтаксис:
false || raise "Error"
Однако это действительно:
false or raise "Error"
Вы можете сделать первую работу с помощью(), но использование or - правильный метод.
false || (raise "Error")
Ответ 4
puts false or true → печатает: false
puts false || true puts false || true → печатает: правда
Ответ 5
Как я использую эти операторы:
||, && для булевой логики. or, and для контроля потока. Например
do_smth if may_be || may_be 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)
Ответ 6
или не совпадает с ||
Использовать только || оператора вместо оператора или.
Причины:
- Оператор
- или имеет более низкий приоритет, чем ||
- или имеют более низкий приоритет, чем = оператор присваивания
- и и или имеют тот же приоритет, в то время как && имеет более высокий приоритет, чем ||
Ответ 7
Оба "или" и "||" оцените значение true, если оба операнда верны. Они оценивают свой второй операнд только в том случае, если первый ложь.
Как и в случае "и", единственная разница между "или" и "||" является их приоритетом.
Просто, чтобы сделать жизнь интересной ", и" и "или" имеют тот же приоритет, в то время как "& &" имеет более высокий приоритет, чем "||" .
Ответ 8
Просто чтобы добавить к mopoke ответ, это также вопрос семантики. or считается хорошей практикой, потому что он читается намного лучше, чем ||.