Réponses:
and
est identique &&
mais avec une priorité inférieure . Ils utilisent tous deux une évaluation de court-circuit .
AVERTISSEMENT: a and
même une priorité inférieure à celle =
que vous voudrez généralement éviter and
. Un exemple d'utilisation and
doit être trouvé dans le Rails Guide sous " Eviter les erreurs de double rendu ".
&&
, alors qu'il and
ne devrait être utilisé que pour des cas très spécifiques.
and
est comme inversé if
modificateur de déclaration: next if widget = widgets.pop
devient widget = widgets.pop and next
Voilà un excellent moyen de le mettre, a vraiment fait. « Click » dans ma tête (Et. or
Est comme un inversé unless
modificateur.)
La différence pratique est la force de liaison, qui peut conduire à un comportement particulier si vous n'y ê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 fonctionne pour ||
et or
.
a = foo and bar
et (a = foo ) && bar
prouve que and
la priorité est inférieure à &&
.
a = foo and bar
est équivalent à (a = :foo) and nil
. Étant donné que l'affectation renvoie une valeur logiquement vraie ( :foo
), la deuxième partie est évaluée, ce qui échoue, en retournant nil
.
Le Ruby Style Guide le dit mieux que moi:
Utilisez && / || pour les expressions booléennes et / ou pour le flux de contrôle. (Règle générale: si vous devez utiliser des parenthèses externes, vous utilisez les mauvais opérateurs.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and
/ or
complètement, et ils pourraient avoir un point. Souvent, leur utilisation dans le flux de contrôle peut être plus clairement écrite avec if
/ unless
operators de toute façon (par exemple document.save! unless document.saved?
)
||
et &&
lier avec la priorité que vous attendez des opérateurs booléens dans les langages de programmation ( &&
est très fort, ||
est légèrement moins fort).
and
et or
ont une priorité inférieure.
Par exemple, contrairement à ||
, or
a une priorité inférieure à =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
De même, contrairement à &&
, a and
également une priorité inférieure à =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
De plus, contrairement à &&
et ||
, and
et or
liez 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 faiblement contraignant and
et or
peut être utile à des fins de contrôle de flux: voir http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, or
a une priorité inférieure à =
" ... maintenant, cela a plus de sens, merci!
and
a une priorité inférieure à &&
.
Mais pour un utilisateur modeste, des problèmes peuvent survenir s'il est utilisé avec d'autres opérateurs dont la priorité se situe entre, par exemple, l'opérateur d'affectation:
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
and
a une priorité plus faible, nous l'utilisons principalement comme modificateur de flux de contrôle tel que if
:
next if widget = widgets.pop
devient
widget = widgets.pop and next
Pour or
:
raise "Not ready!" unless ready_to_rock?
devient
ready_to_rock? or raise "Not ready!"
Je préfère utiliser if
mais pas and
, parce que if
c'est plus intelligible, donc j'ignore juste and
et or
.
Reportez-vous à " Utilisation de" et "et" ou "dans Ruby " pour plus d'informations.
Je ne sais pas si c'est l'intention de Ruby ou s'il s'agit d'un bogue, mais essayez ce code ci-dessous. Ce code a été exécuté sur Ruby version 2.5.1 et était sur un système Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
et||
.