369 votes

Différence entre "et" et && en Ruby?

Quelle est la différence entre le && et and opérateurs en Ruby?

395voto

Dominic Rodger Points 44489

and est le même que && mais avec une priorité inférieure. Ils utilisent tous les deux évaluation de court-circuit.

259voto

tadman Points 70178

En pratique, la différence est la force de liaison, ce qui peut conduire à des comportement anormal si vous n'êtes pas préparé:

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

La même chose travaille pour || et or.

65voto

Andrew Grimm Points 22996

Le Ruby Guide de Style , dit-il mieux que je le pouvais:

Utiliser &&/|| pour les expressions booléennes, et/ou pour le contrôle de flux. (Règle de pouce: Si vous devez utiliser l'extérieur des parenthèses, vous utilisez le mauvais des opérateurs.)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

41voto

Gabe Kopley Points 7361

|| et && se lier avec la priorité que vous attendez d'opérateurs booléens dans les langages de programmation (&& est très fort, || est légèrement moins forte).

and et or ont priorité inférieure.

Par exemple, contrairement aux ||, or a priorité moins élevée =:

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

De même, contrairement à &&, and a également de priorité plus basse que =:

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

De plus, contrairement à d' && et ||, and et or se lier avec la même priorité:

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

Le peu de liaison and et or peut être utile pour le contrôle des flux de fins: voir http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .

21voto

Santosh Points 6791

and a priorité moins élevée &&.

Mais pour un modeste utilisateur, des problèmes peuvent se produire si il est utilisé avec d'autres opérateurs, dont l'ordre de priorité sont entre, par exemple, l'opérateur d'affectation.

par exemple

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X