Разница между "или" и || в Рубине?

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