Відповіді:
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
та||
.