Was ist der Unterschied zwischen den &&
und and
Operatoren in Ruby?
Antworten
Zu viele Anzeigen?und
entspricht &&
, hat jedoch eine geringere Präzedenz. Beide verwenden die Kurzschlussauswertung.
WARNUNG: und
hat sogar eine geringere Präzedenz als =
, daher sollten Sie und
in der Regel vermeiden. Ein Beispiel, wann und
verwendet werden sollte, finden Sie im Rails Guide unter "Vermeidung von doppelten Render-Fehlern".
Der praktische Unterschied liegt in der Bindungsstärke, die zu eigenartigem Verhalten führen kann, wenn man nicht darauf vorbereitet ist:
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
Dasselbe gilt für ||
und or
.
Der Ruby Style Guide sagt es besser als ich es könnte:
Benutze &&/|| für boolesche Ausdrücke, and/or für die Steuerung des Ablaufs. (Faustregel: Wenn du äußere Klammern verwenden musst, verwendest du die falschen Operatoren.)
# boolescher Ausdruck
if some_condition && some_other_condition
do_something
end
# Steuerung des Ablaufs
document.saved? or document.save!
||
und &&
binden mit der Präzedenz, die man von booleschen Operatoren in Programmiersprachen erwartet (&&
ist sehr stark, ||
ist etwas weniger stark).
and
und or
haben eine niedrigere Präzedenz.
Zum Beispiel hat im Gegensatz zu ||
das or
eine niedrigere Präzedenz als =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Ebenso hat im Gegensatz zu &&
auch das and
eine niedrigere Präzedenz als =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Zudem binden im Gegensatz zu &&
und ||
das and
und or
mit gleicher Präzedenz:
> !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
Die schwach bindenden and
und or
können für Kontrollflusszwecke nützlich sein: siehe http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/.
and
hat eine niedrigere Präzedenz als &&
.
Aber für einen unbedarften Benutzer können Probleme auftreten, wenn es zusammen mit anderen Operatoren verwendet wird, bei denen die Präzedenz dazwischen liegt, zum Beispiel der Zuweisungsoperator:
def happy?() true; end
def know_it?() true; end
todo = happy? && know_it? ? "Klatsche in die Hände" : "Nichts tun"
todo
# => "Klatsche in die Hände"
todo = happy? and know_it? ? "Klatsche in die Hände" : "Nichts tun"
todo
# => true
- See previous answers
- Weitere Antworten anzeigen