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öchten and
. Ein Beispiel and
für die Verwendung finden Sie im Rails-Handbuch unter " Vermeiden von Fehlern beim doppelten Rendern ".
&&
, während and
nur für sehr spezielle Fälle verwendet werden sollte.
and
ist als if
Modifikator für umgekehrte Aussagen: next if widget = widgets.pop
wird widget = widgets.pop and next
. Das ist eine großartige Art, es auszudrücken, hat es wirklich in meinem Kopf" klicken "lassen. (Und or
ist wie ein unless
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:
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
Das gleiche funktioniert für ||
und or
.
a = foo and bar
und (a = foo ) && bar
beweist, dass dies and
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ück nil
.
Der Ruby Style Guide sagt es besser als ich könnte:
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.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and
/ or
vollständig, und sie könnten einen Punkt haben. Oft könnte ihre Verwendung im Kontrollfluss ohnehin offensichtlicher mit if
/ unless
operator geschrieben werden (zB document.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
und or
haben eine niedrigere Priorität.
Zum Beispiel, im Gegensatz zu ||
, or
hat eine geringere Priorität als =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Ebenso im Gegensatz zu &&
, and
hat auch niedrigere Priorität als =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Was mehr ist , im Gegensatz zu &&
und ||
, and
und or
binden mit gleicher Priorität:
> !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
Das ist schwach bindend and
und or
kann für Kontrollflusszwecke nützlich sein: siehe http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, 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.
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
hat eine niedrigere Priorität, meistens verwenden wir es als Kontrollflussmodifikator wie if
:
next if widget = widgets.pop
wird
widget = widgets.pop and next
Für or
:
raise "Not ready!" unless ready_to_rock?
wird
ready_to_rock? or raise "Not ready!"
Ich bevorzuge es zu benutzen, if
aber nicht and
, weil if
es verständlicher ist, also ignoriere ich einfach and
und or
.
Weitere Informationen finden Sie unter " Verwenden von" und "und" oder "in Ruby ".
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.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
und||
.