WARNUNG: Hat andsogar eine niedrigere Priorität als die =, die Sie normalerweise vermeiden möchten and. Ein Beispiel andfür die Verwendung finden Sie im Rails-Handbuch unter " Vermeiden von Fehlern beim doppelten Rendern ".
Aus Andrew Marshalls Link: "Eine andere Art zu denken andist als ifModifikator für umgekehrte Aussagen: next if widget = widgets.popwird widget = widgets.pop and next. Das ist eine großartige Art, es auszudrücken, hat es wirklich in meinem Kopf" klicken "lassen. (Und orist wie ein unlessModifikator für umgekehrte Aussagen .)
GMA
1
Kombinieren Sie diese Antwort mit den Details von Tadmans Antwort und Sie erhalten das ganze Bild.
Sargas
5
Avdi hat seine Einstellung zum Zeitpunkt der Verwendung und vs. && aktualisiert. Verwenden Sie grundsätzlich 'und' und 'oder' für den Kontrollfluss, da diese eine geringere Priorität haben. devblog.avdi.org/2014/08/26/…
EricC
238
Der praktische Unterschied ist die Bindungsstärke, die zu eigenartigem Verhalten führen kann, wenn Sie nicht darauf vorbereitet sind:
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 barund(a = foo ) && bar beweist, dass dies andeine geringere Priorität hat als &&.
Sargas
Ich verstehe es nicht: Was soll "foo and bar" zurückkehren?
BKSpurgeon
a = foo and barist äquivalent zu (a = :foo) and nil. Da die Zuweisung einen logisch wahren Wert ( :foo) zurückgibt, wertet der zweite Teil aus, was fehlschlägt, und gibt zurück nil.
Verwenden Sie && / || für boolesche Ausdrücke und / oder für den Kontrollfluss. (Faustregel: Wenn Sie äußere Klammern verwenden müssen, verwenden Sie die falschen Operatoren.)
@akostadinov für den Fall, dass Sie nicht trollten: Der Ruby Style Guide wurde nicht von den Machern von Ruby geschrieben. Ruby wurde von Yukihiro Matsumoto und anderen erstellt, während der Ruby Style Guide hauptsächlich von Bozhidar Batsov verfasst wurde.
Andrew Grimm
2
@ AndrewGrimm, danke, gut zu wissen. Entschuldigung für das Trolling, aber ich bin aufrichtig verwirrt mit einigen Aspekten der rubinroten Realität. Eines ist sicher: Jedes Ruby-Projekt benötigt strenge Stilrichtlinien, um die Codebasis wartbar zu halten.
Akostadinov
37
||und &&binden Sie mit der Priorität, die Sie von booleschen Operatoren in Programmiersprachen erwarten ( &&ist sehr stark, ||ist etwas weniger stark).
andund orhaben eine niedrigere Priorität.
Zum Beispiel, im Gegensatz zu ||, orhat eine geringere Priorität als =:
> a =false||true=>true> a
=>true> a =falseortrue=>true> a
=>false
Ebenso im Gegensatz zu &&, andhat auch niedrigere Priorität als =:
> a =true&&false=>false> a
=>false> a =trueandfalse=>false> a
=>true
Was mehr ist , im Gegensatz zu &&und ||, andund orbinden mit gleicher Priorität:
"im Gegensatz zu ||, orhat eine niedrigere Priorität als =" ... jetzt macht es mehr Sinn, danke!
Steph Sharp
18
andhat eine niedrigere Priorität als &&.
Für einen unscheinbaren Benutzer können jedoch Probleme auftreten, wenn er zusammen mit anderen Operatoren verwendet wird, deren Vorrang zwischen dem Zuweisungsoperator liegt, z.
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
Ich weiß nicht, ob dies Ruby-Absicht ist oder ob dies ein Fehler ist, aber versuchen Sie diesen Code unten. Dieser Code wurde auf Ruby Version 2.5.1 ausgeführt und befand sich auf einem Linux-System.
or
und||
.Antworten:
and
ist das gleiche wie&&
aber mit niedrigerer Priorität . Beide verwenden eine Kurzschlussauswertung .WARNUNG: Hat
and
sogar eine niedrigere Priorität als die=
, die Sie normalerweise vermeiden möchtenand
. Ein Beispieland
für die Verwendung finden Sie im Rails-Handbuch unter " Vermeiden von Fehlern beim doppelten Rendern ".quelle
&&
, währendand
nur für sehr spezielle Fälle verwendet werden sollte.and
ist alsif
Modifikator für umgekehrte Aussagen:next if widget = widgets.pop
wirdwidget = widgets.pop and next
. Das ist eine großartige Art, es auszudrücken, hat es wirklich in meinem Kopf" klicken "lassen. (Undor
ist wie einunless
Modifikator für umgekehrte Aussagen .)Der praktische Unterschied ist die Bindungsstärke, die zu eigenartigem Verhalten führen kann, wenn Sie nicht darauf vorbereitet sind:
Das gleiche funktioniert für
||
undor
.quelle
a = foo and bar
und(a = foo ) && bar
beweist, dass diesand
eine geringere Priorität hat als&&
.a = foo and bar
ist äquivalent zu(a = :foo) and nil
. Da die Zuweisung einen logisch wahren Wert (:foo
) zurückgibt, wertet der zweite Teil aus, was fehlschlägt, und gibt zurücknil
.Der Ruby Style Guide sagt es besser als ich könnte:
quelle
and
/or
vollständig, und sie könnten einen Punkt haben. Oft könnte ihre Verwendung im Kontrollfluss ohnehin offensichtlicher mitif
/unless
operator geschrieben werden (zBdocument.save! unless document.saved?
)||
und&&
binden Sie mit der Priorität, die Sie von booleschen Operatoren in Programmiersprachen erwarten (&&
ist sehr stark,||
ist etwas weniger stark).and
undor
haben eine niedrigere Priorität.Zum Beispiel, im Gegensatz zu
||
,or
hat eine geringere Priorität als=
:Ebenso im Gegensatz zu
&&
,and
hat auch niedrigere Priorität als=
:Was mehr ist , im Gegensatz zu
&&
und||
,and
undor
binden mit gleicher Priorität:Das ist schwach bindend
and
undor
kann für Kontrollflusszwecke nützlich sein: siehe http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .quelle
||
,or
hat eine niedrigere Priorität als=
" ... jetzt macht es mehr Sinn, danke!and
hat eine niedrigere Priorität als&&
.Für einen unscheinbaren Benutzer können jedoch Probleme auftreten, wenn er zusammen mit anderen Operatoren verwendet wird, deren Vorrang zwischen dem Zuweisungsoperator liegt, z.
quelle
and
hat eine niedrigere Priorität, meistens verwenden wir es als Kontrollflussmodifikator wieif
:wird
Für
or
:wird
Ich bevorzuge es zu benutzen,
if
aber nichtand
, weilif
es verständlicher ist, also ignoriere ich einfachand
undor
.Weitere Informationen finden Sie unter " Verwenden von" und "und" oder "in Ruby ".
quelle
Ich weiß nicht, ob dies Ruby-Absicht ist oder ob dies ein Fehler ist, aber versuchen Sie diesen Code unten. Dieser Code wurde auf Ruby Version 2.5.1 ausgeführt und befand sich auf einem Linux-System.
quelle