Какая разница между операторами 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
считается хорошей практикой, потому что он читается намного лучше, чем ||
.