Как уже объяснили другие, разница только является приоритетом. Тем не менее, я хотел бы отметить, что на самом деле два различия между ними:
and
, or
и not
имеют намного меньший приоритет, чем &&
, ||
и !
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 появляются вместе, вы обычно хотите, чтобы их оценивали просто слева направо.