Відповіді:
andте саме, &&але з нижчим пріоритетом . Вони обидва використовують оцінку короткого замикання .
ПОПЕРЕДЖЕННЯ. andНавіть має нижчий пріоритет, ніж =зазвичай цього потрібно уникати and. Приклад, коли його andпотрібно використовувати, ви можете знайти в Посібнику з рейок у розділі " Уникнення подвійних помилок візуалізації ".
&&, тоді як він 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 версії 2.5.1 і знаходився в системі Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
orта||.