В чем разница между операторами &&
и and
в Ruby?
Разница между "и" и "&" в Ruby?
Ответ 1
and
такой же как &&
но с более низким приоритетом. Они оба используют оценку короткого замыкания.
ВНИМАНИЕ: and
даже имеет более низкий приоритет, чем =
так что вы обычно хотите избегать and
. Пример использования and
его использования можно найти в руководстве по Rails: https://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors
Ответ 2
Практическое различие - сила связи, которая может привести к своеобразному поведению, если вы не готовы к этому:
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
.
Ответ 3
Ruby Style Guide говорит, что это лучше, чем я мог:
Использовать &/|| для булевых выражений и/или для потока управления. (Правило thumb: Если вам нужно использовать внешние скобки, вы используете неправильные операторы.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
Ответ 4
||
и &&
связывают с приоритетом, который вы ожидаете от булевых операторов в языках программирования (&&
очень сильный, ||
немного менее сильный).
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/.
Ответ 5
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
Ответ 6
и имеет более низкий приоритет, в основном мы используем его в качестве модификатора потока управления, например, если
next if widget = widgets.pop
становится
widget = widgets.pop and next
для или
raise "Not ready!" unless ready_to_rock?
становится
ready_to_rock? or raise "Not ready!"
Я предпочитаю использовать если, но не и, потому что, если это более понятно, поэтому я просто игнорирую и и или или.
Ссылка на
Ответ 7
Я не знаю, является ли это намерением Ruby или это ошибка, но попробуйте этот код ниже. Этот код был запущен в Ruby версии 2.5.1 и в системе Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true