Diferença entre “e” e && em Ruby?

Qual é a diferença entre os operadores && e and em Ruby?

   

and é o mesmo que && mas com menor precedência . Ambos usam avaliação de curto-circuito .

ATENÇÃO: and ainda tem precedência menor que = então você vai querer evitar and sempre

A diferença prática é a força de binding, que pode levar a um comportamento peculiar se você não estiver preparado para isso:

 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 mesma coisa funciona para || e or .

O Ruby Style Guide diz que é melhor do que eu poderia:

Use && / || para expressões booleanas e / ou para stream de controle. (Regra de ouro: se você tiver que usar parênteses externos, você está usando os operadores errados.)

 # boolean expression if some_condition && some_other_condition do_something end # control flow document.saved? or document.save! 

|| e && ligar com a precedência que você espera dos operadores booleanos nas linguagens de programação ( && é muito forte, || é um pouco menos forte).

and e or ter menor precedência.

Por exemplo, ao contrário de || , or tem precedência menor que = :

 > a = false || true => true > a => true > a = false or true => true > a => false 

Da mesma forma, ao contrário de && , and também tem menor precedência do que = :

 > a = true && false => false > a => false > a = true and false => false > a => true 

Além do mais, ao contrário de && e || , and e or vincular com precedência igual:

 > !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 

A binding fraca and / or pode ser útil para fins de stream de controle: veja http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .

and tem precedência menor que && .

Mas, para um usuário despretensioso, podem ocorrer problemas se ele for usado junto com outros operadores cuja precedência esteja entre eles, por exemplo, o operador de atribuição.

por exemplo

 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 

e tem menor precedência, principalmente usamos como modificador de stream de controle, como se

 next if widget = widgets.pop 

torna-se

 widget = widgets.pop and next 

para ou

 raise "Not ready!" unless ready_to_rock? 

torna-se

 ready_to_rock? or raise "Not ready!" 

Eu prefiro usar se, mas não, e , porque se é mais inteligível, então eu simplesmente ignoro e ou ou .

Referência a

Usando “e” e “ou” em Ruby

Eu não sei se isso é intenção do Ruby ou se isso é um bug, mas tente este código abaixo. Este código foi executado na versão 2.5.1 do Ruby e estava em um sistema Linux.

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