Ответы:
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и||.