Разница между "и" и "&" в Ruby?

В чем разница между операторами && и and в 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!"

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

Ссылка на

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

Ответ 7

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

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

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