Різниця між "і" та && в Ruby?


Відповіді:


349

andте саме, &&але з нижчим пріоритетом . Вони обидва використовують оцінку короткого замикання .

ПОПЕРЕДЖЕННЯ. andНавіть має нижчий пріоритет, ніж =зазвичай цього потрібно уникати and. Приклад, коли його andпотрібно використовувати, ви можете знайти в Посібнику з рейок у розділі " Уникнення подвійних помилок візуалізації ".


50
Було б непогано вказати, що зазвичай слід використовувати &&, тоді як він andповинен використовуватися лише для дуже конкретних випадків.
Марк-Андре Лафортун

10
Ще одне добре пояснення тут: devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby .
Ендрю Маршалл

17
З посилання Ендрю Маршалла: "Інший спосіб мислення and- це як модифікований ifмодифікатор висловлювань: next if widget = widgets.popстає widget = widgets.pop and next. Це прекрасний спосіб поставити його, дійсно змусив його" натиснути "в моїй голові (і orце як перевернутий unlessмодифікатор.)
GMA

1
Поєднайте цю відповідь з деталями відповіді тадмана, і ви отримаєте всю картину.
саргаз

5
Авді оновив свою роботу щодо використання та проти &&. В основному використовуйте 'і' і 'або' для контрольного потоку через їх нижчий пріоритет. devblog.avdi.org/2014/08/26/…
EricC

238

Практична відмінність - сила міцності, яка може призвести до особливої ​​поведінки, якщо ви не готові до цього:

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.


2
a = foo and bar і (a = foo ) && bar доводить, що andмає нижчий пріоритет ніж &&.
саргаз

я не розумію: що означає "foo and bar", щоб повернутися?
BKSpurgeon

a = foo and barеквівалентно (a = :foo) and nil. Оскільки присвоєння повертає логічно істинне значення ( :foo), то друга частина оцінює, яка не відповідає, повертаючи nil.
тадман

61

Керівництво по стилю Ruby говорить про це краще, ніж я міг:

Використовувати && / || для булевих виразів та / або для управління потоком. (Правило: якщо вам потрібно використовувати зовнішні дужки, ви використовуєте неправильні оператори.)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

53
Насправді керівництво зараз каже уникати and/ orповністю, і вони можуть мати точку. Часто їх використання в контрольному потоці все одно може бути чіткіше написано з if/ unlessоператорами (наприклад document.save! unless document.saved?)
Ярін

@akostadinov у випадку, якщо ви не тролінгу: керівництво про стиль Ruby не написано творцями Ruby. Рубі створено Юкіхіро Мацумото та іншими, а керівництво по стилю Рубі - головним чином Божидаром Бацовим.
Ендрю Грімм

2
@AndrewGrimm, дякую, добре знати. Вибачте за тролінг, але я щиро плутаю деякі аспекти дійсності в рубіні. Одне впевнене - кожен рубіновий проект потребує суворої політики стилів, щоб підтримувати базу коду.
акостадінов

37

||і &&пов'язуйте з тим пріоритетом, який ви очікуєте від булевих операторів у мовах програмування ( &&дуже сильний, ||трохи менш сильний).

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/ .


2
« В відміну ||, orмає більш низький пріоритет , ніж =» ... тепер це має сенс, спасибі!
Steph Sharp

18

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

1
Дякую, але чим пріоритет "та" відрізняється від "&&"?
BKSpurgeon

2
@BKSpurgeon Дивіться тут для впорядкованого списку пріоритетів операторів в Ruby.
thutt

5

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 ".


0

Я не знаю, чи є це намір Рубі чи це помилка, але спробуйте цей код нижче. Цей код виконувався в Ruby версії 2.5.1 і знаходився в системі Linux.

puts 1 > -1 and 257 < 256
# => false

puts 1 > -1 && 257 < 256
# => true

1
@JakubArnold Сарказм ніколи не корисний. Приклади іноді є.
BobRodes

@BobRodes Це був не сарказм. Є 7 відповідей, 6 з яких уже мають приклади.
Якуб Арнольд

1
@JakubArnold Я все-таки вважаю цей приклад корисним.
BobRodes

Я також отримую дивні результати. v1 = true та false p v1 # => app.rb: true, IRB: false v2 = true && false p v2 # => app.rb: false, IRB: false ставить 1> -1 && 257 <256 # => app.rb: false, IRB: false
Rich_F
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.