384 Stimmen

Unterschied zwischen "and" und && in Ruby?

Was ist der Unterschied zwischen den && und and Operatoren in Ruby?

408voto

Dominic Rodger Punkte 93942

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".

261voto

tadman Punkte 200181

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.

69voto

Andrew Grimm Punkte 73882

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!

43voto

Gabe Kopley Punkte 15797

|| 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/.

23voto

Santhosh Punkte 26455

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X