ПРЕДУПРЕЖДЕНИЕ: andдаже имеет более низкий приоритет, чем =вы, как правило, хотите избежать and. Пример, когда его andследует использовать, можно найти в Руководстве по Rails под заголовком « Избегание ошибок двойной визуализации ».
Из ссылки Эндрю Маршалла: «Другой способ думать 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
a = foo and barи(a = foo ) && bar доказывает, что andимеет более низкий приоритет, чем &&.
Саргас
я не понимаю: что значит "foo and bar" вернуть?
BKSpurgeon
a = foo and barэквивалентно (a = :foo) and nil. Поскольку присваивание возвращает логически истинное значение ( :foo), вторая часть вычисляет, что не удается, и возвращает nil.
Используйте && / || для логических выражений и / или для потока управления. (Практическое правило. Если вам нужно использовать внешние скобки, вы используете неправильные операторы.)
@akostadinov на случай, если вы не троллите: руководство по Ruby Style не написано создателями Ruby. Ruby был создан Юкихиро Мацумото и другими, в то время как Ruby Style Guide был главным образом Божидар Бацов.
Эндрю Гримм
2
@AndrewGrimm, спасибо, приятно знать. Извините за троллинг, но я искренне путаюсь с некоторыми аспектами рубиновой реальности. Одно можно сказать наверняка - каждый ruby-проект нуждается в строгих политиках стилей, чтобы обеспечить поддержку кода.
Акостадинов
37
||и &&связать с тем приоритетом, который вы ожидаете от логических операторов в языках программирования ( &&очень сильный, ||немного менее сильный).
andи orимеют более низкий приоритет.
Например, в отличие от ||, orимеет более низкий приоритет, чем =:
> a =false||true=>true> a=>true> a =falseortrue=>true> a=>false
Аналогично, в отличие &&, andтакже имеет более низкий приоритет, чем =:
> a =true&&false=>false> a=>false> a =trueandfalse=>false> a=>true
Более того, в отличие от &&и ||, andи orсвязать с равным приоритетом:
"в отличие от ||, orимеет более низкий приоритет, чем =" ... теперь это имеет больше смысла, спасибо!
Steph Sharp
18
andимеет более низкий приоритет, чем &&.
Но для непритязательного пользователя могут возникнуть проблемы, если он используется вместе с другими операторами, приоритет которых находится между, например, оператором присваивания:
def happy?()true;enddef 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
or
и||
.Ответы:
and
то же самое,&&
но с более низким приоритетом . Они оба используют оценку короткого замыкания .ПРЕДУПРЕЖДЕНИЕ:
and
даже имеет более низкий приоритет, чем=
вы, как правило, хотите избежатьand
. Пример, когда егоand
следует использовать, можно найти в Руководстве по Rails под заголовком « Избегание ошибок двойной визуализации ».источник
&&
, в то время какand
следует использовать только для очень конкретных случаев.and
- этоif
модификатор обратного выражения:next if widget = widgets.pop
становитсяwidget = widgets.pop and next
. Это отличный способ выразить это, действительно заставил его« щелкнуть »в моей голове. (Иor
похоже на обратныйunless
модификатор.)Практическая разница заключается в силе связывания, которая может привести к необычному поведению, если вы не готовы к этому:
То же самое работает для
||
иor
.источник
a = foo and bar
и(a = foo ) && bar
доказывает, чтоand
имеет более низкий приоритет, чем&&
.a = foo and bar
эквивалентно(a = :foo) and nil
. Поскольку присваивание возвращает логически истинное значение (:foo
), вторая часть вычисляет, что не удается, и возвращаетnil
.Руководство по стилю в Ruby говорит лучше, чем я:
источник
and
/or
полностью, и они могут иметь смысл. Часто их использование в потоке управления может быть более явно записано сif
/unless
операторами (напримерdocument.save! unless document.saved?
)||
и&&
связать с тем приоритетом, который вы ожидаете от логических операторов в языках программирования (&&
очень сильный,||
немного менее сильный).and
иor
имеют более низкий приоритет.Например, в отличие от
||
,or
имеет более низкий приоритет, чем=
:Аналогично, в отличие
&&
,and
также имеет более низкий приоритет, чем=
:Более того, в отличие от
&&
и||
,and
иor
связать с равным приоритетом:Слабое связывание
and
иor
может быть полезно для целей управления потоком: см. Http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .источник
||
,or
имеет более низкий приоритет, чем=
" ... теперь это имеет больше смысла, спасибо!and
имеет более низкий приоритет, чем&&
.Но для непритязательного пользователя могут возникнуть проблемы, если он используется вместе с другими операторами, приоритет которых находится между, например, оператором присваивания:
источник
and
имеет более низкий приоритет, в основном мы используем его как модификатор потока управления, такой какif
:становится
Для
or
:становится
Я предпочитаю использовать,
if
но нетand
, потому чтоif
это более понятно, поэтому я просто игнорируюand
иor
.Обратитесь к разделу « Использование« и »и« или »в Ruby » для получения дополнительной информации.
источник
Я не знаю, является ли это намерением Ruby или это ошибка, но попробуйте этот код ниже. Этот код был запущен в Ruby версии 2.5.1 и в системе Linux.
источник