Ответы:
and
то же самое, &&
но с более низким приоритетом . Они оба используют оценку короткого замыкания .
ПРЕДУПРЕЖДЕНИЕ: and
даже имеет более низкий приоритет, чем =
вы, как правило, хотите избежать and
. Пример, когда его and
следует использовать, можно найти в Руководстве по Rails под заголовком « Избегание ошибок двойной визуализации ».
&&
, в то время как and
следует использовать только для очень конкретных случаев.
and
- это if
модификатор обратного выражения: next if widget = widgets.pop
становится widget = widgets.pop and next
. Это отличный способ выразить это, действительно заставил его« щелкнуть »в моей голове. (И or
похоже на обратный unless
модификатор.)
Практическая разница заключается в силе связывания, которая может привести к необычному поведению, если вы не готовы к этому:
foo = :foo
bar = nil
a = foo and bar
# => nil
a
# => :foo
a = foo && bar
# => nil
a
# => nil
a = (foo and bar)
# => nil
a
# => nil
(a = foo) && bar
# => nil
a
# => :foo
То же самое работает для ||
и or
.
a = foo and bar
и (a = foo ) && bar
доказывает, что and
имеет более низкий приоритет, чем &&
.
a = foo and bar
эквивалентно (a = :foo) and nil
. Поскольку присваивание возвращает логически истинное значение ( :foo
), вторая часть вычисляет, что не удается, и возвращает nil
.
Руководство по стилю в Ruby говорит лучше, чем я:
Используйте && / || для логических выражений и / или для потока управления. (Практическое правило. Если вам нужно использовать внешние скобки, вы используете неправильные операторы.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and
/ or
полностью, и они могут иметь смысл. Часто их использование в потоке управления может быть более явно записано с if
/ unless
операторами (например document.save! unless document.saved?
)
||
и &&
связать с тем приоритетом, который вы ожидаете от логических операторов в языках программирования ( &&
очень сильный, ||
немного менее сильный).
and
и or
имеют более низкий приоритет.
Например, в отличие от ||
, or
имеет более низкий приоритет, чем =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Аналогично, в отличие &&
, and
также имеет более низкий приоритет, чем =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Более того, в отличие от &&
и ||
, and
и or
связать с равным приоритетом:
> !puts(1) || !puts(2) && !puts(3)
1
=> true
> !puts(1) or !puts(2) and !puts(3)
1
3
=> true
> !puts(1) or (!puts(2) and !puts(3))
1
=> true
Слабое связывание and
и or
может быть полезно для целей управления потоком: см. Http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, or
имеет более низкий приоритет, чем =
" ... теперь это имеет больше смысла, спасибо!
and
имеет более низкий приоритет, чем &&
.
Но для непритязательного пользователя могут возникнуть проблемы, если он используется вместе с другими операторами, приоритет которых находится между, например, оператором присваивания:
def happy?() true; end
def know_it?() true; end
todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"
todo
# => "Clap your hands"
todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"
todo
# => true
and
имеет более низкий приоритет, в основном мы используем его как модификатор потока управления, такой как if
:
next if widget = widgets.pop
становится
widget = widgets.pop and next
Для or
:
raise "Not ready!" unless ready_to_rock?
становится
ready_to_rock? or raise "Not ready!"
Я предпочитаю использовать, if
но нет and
, потому что if
это более понятно, поэтому я просто игнорирую and
и or
.
Обратитесь к разделу « Использование« и »и« или »в Ruby » для получения дополнительной информации.
Я не знаю, является ли это намерением Ruby или это ошибка, но попробуйте этот код ниже. Этот код был запущен в Ruby версии 2.5.1 и в системе Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
и||
.