Разница между "и" и && в Ruby? - PullRequest
294 голосов
/ 15 сентября 2009

В чем разница между операторами && и and в Ruby?

Ответы [ 7 ]

328 голосов
/ 15 сентября 2009

and совпадает с &&, но с меньшим приоритетом . Они оба используют оценку короткого замыкания .

ВНИМАНИЕ: and даже имеет более низкий приоритет, чем =, поэтому вам следует избегать and всегда

236 голосов
/ 16 сентября 2009

Практическая разница заключается в силе связывания, которая может привести к странному поведению, если вы не готовы к этому:

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.

58 голосов
/ 18 мая 2012

Ruby Style Guide говорит, что лучше, чем я мог:

Используйте && / || для логических выражений и / или для потока управления. (Правило большой палец: если вам нужно использовать внешние скобки, вы используете неправильный операторы.)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!
36 голосов
/ 20 октября 2012

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

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

17 голосов
/ 12 июня 2014

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
5 голосов
/ 19 октября 2016

и имеют более низкий приоритет, в основном мы используем его в качестве модификатора потока управления, например , если

next if widget = widgets.pop

становится

widget = widgets.pop and next

для или

raise "Not ready!" unless ready_to_rock?

становится

ready_to_rock? or raise "Not ready!"

Я предпочитаю использовать , если , но не и , потому что , если более понятно, поэтому я просто игнорирую и и или .

Ссылка на

Использование «и» и «или» в Ruby

0 голосов
/ 27 июля 2018

Не знаю, является ли это намерением Ruby или это ошибка, но попробуйте этот код ниже. Этот код был запущен в Ruby версии 2.5.1 и в системе Linux.

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

puts 1 > -1 && 257 < 256
# => true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...