Quelle est la différence entre le &&
et and
opérateurs en Ruby?
Réponses
Trop de publicités?and
est le même que &&
mais avec une priorité inférieure. Ils utilisent tous les deux évaluation de court-circuit.
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
.
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!
||
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/ .
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