AVERTISSEMENT: a andmême une priorité inférieure à celle =que vous voudrez généralement éviter and. Un exemple d'utilisation anddoit être trouvé dans le Rails Guide sous " Eviter les erreurs de double rendu ".
Ce serait une bonne idée de spécifier que l'on devrait généralement utiliser &&, alors qu'il andne devrait être utilisé que pour des cas très spécifiques.
Du lien Andrew Marshall: « Une autre façon de penser andest comme inversé ifmodificateur de déclaration: next if widget = widgets.popdevient widget = widgets.pop and nextVoilà un excellent moyen de le mettre, a vraiment fait. « Click » dans ma tête (Et. orEst comme un inversé unlessmodificateur.)
GMA
1
Combinez cette réponse avec les détails de la réponse de tadman et vous obtenez l'image entière.
sargas
5
Avdi a mis à jour son point de vue sur l'utilisation et sur &&. Fondamentalement, utilisez «et» et «ou» pour le flux de contrôle en raison de leur priorité inférieure. devblog.avdi.org/2014/08/26/…
EricC
238
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
a = foo and baret(a = foo ) && bar prouve que andla priorité est inférieure à &&.
sargas
je ne comprends pas: qu'est-ce que "foo and bar" est censé retourner?
BKSpurgeon
a = foo and barest é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.
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.)
@akostadinov au cas où vous ne seriez pas à la traîne: le guide Ruby Style n'est pas écrit par les créateurs de Ruby. Ruby a été créé par Yukihiro Matsumoto et d'autres, tandis que le Ruby Style Guide a été principalement par Bozhidar Batsov.
Andrew Grimm
2
@AndrewGrimm, merci, bon à savoir. Désolé pour la pêche à la traîne, mais je suis sincèrement confus avec certains aspects de la réalité rubis. Une chose est sûre - chaque projet Ruby a besoin de politiques de style strictes pour maintenir la base de code maintenable.
akostadinov
37
||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).
andet oront une priorité inférieure.
Par exemple, contrairement à ||, ora une priorité inférieure à =:
> a =false||true=>true> a
=>true> a =falseortrue=>true> a
=>false
De même, contrairement à &&, a andégalement une priorité inférieure à =:
> a =true&&false=>false> a
=>false> a =trueandfalse=>false> a
=>true
De plus, contrairement à &&et ||, andet orliez avec la même priorité:
"contrairement à ||, ora une priorité inférieure à =" ... maintenant, cela a plus de sens, merci!
Steph Sharp
18
anda 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;enddef 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
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.
or
et||
.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 éviterand
. Un exemple d'utilisationand
doit être trouvé dans le Rails Guide sous " Eviter les erreurs de double rendu ".la source
&&
, alors qu'iland
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
devientwidget = 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é:
La même chose fonctionne pour
||
etor
.la source
a = foo and bar
et(a = foo ) && bar
prouve queand
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 retournantnil
.Le Ruby Style Guide le dit mieux que moi:
la source
and
/or
complètement, et ils pourraient avoir un point. Souvent, leur utilisation dans le flux de contrôle peut être plus clairement écrite avecif
/unless
operators de toute façon (par exempledocument.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
etor
ont une priorité inférieure.Par exemple, contrairement à
||
,or
a une priorité inférieure à=
:De même, contrairement à
&&
, aand
également une priorité inférieure à=
:De plus, contrairement à
&&
et||
,and
etor
liez avec la même priorité:Le faiblement contraignant
and
etor
peut être utile à des fins de contrôle de flux: voir http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .la source
||
,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:
la source
and
a une priorité plus faible, nous l'utilisons principalement comme modificateur de flux de contrôle tel queif
:devient
Pour
or
:devient
Je préfère utiliser
if
mais pasand
, parce queif
c'est plus intelligible, donc j'ignore justeand
etor
.Reportez-vous à " Utilisation de" et "et" ou "dans Ruby " pour plus d'informations.
la source
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.
la source