Doppeltes kaufmännisches Und-Zeichen in Ruby

7

Ich verwende das Juwel "authlogic" mit Ruby on Rails und habe Folgendes verwendet, um die ID des Benutzers abzurufen, der gerade angemeldet ist:

%Vor%

Ich verstehe nicht, wie current_user & amp; & amp; current_user.record.id gibt die aktuelle Benutzer-ID zurück. Ich würde denken, dass dies einen booleschen Wert zurückgeben würde. Kann jemand erklären, wie das funktioniert?

    
Chad Johnson 01.01.2010, 05:30
quelle

2 Antworten

8

Das logische und kurzgeschlossene. Das heißt, wenn das Konstrukt X & amp; & amp; Y, und X ist falsch, dann wird Y nie überprüft, weil das Ganze sicherlich falsch ist.

Dieser Code sagt im Wesentlichen:

%Vor%

Hier ist eine Konsolenausgabe, die zeigt, dass Sie den zweiten Wert erhalten, wenn der erste wahr ist:

%Vor%

und nil, wenn der erste Null ist:

%Vor%     
Ry4an Brase 01.01.2010, 05:37
quelle
18

Es gibt keinen Boolean -Typ in Ruby; Ruby hat eine ziemlich einfache Sicht auf die Wahrheit (oder genauer, es hat eine ziemlich einfache Sicht auf Unwahrheit ).

  • Das Objekt false , bei dem es sich um die Singleton-Instanz von FalseClass handelt, wird als falsy betrachtet
  • Das nil -Objekt, das die Singleton-Instanz von NilClass ist, ist falsy
  • jedes andere Objekt ist truthy (einschließlich des true -Objekts, welches die Singleton-Instanz von TrueClass ist)

[BTW: Das bedeutet, dass viele Objekte, die in anderen Sprachen als falsy gelten, in Ruby tatsächlich truthy sind, wie die Ganzzahl 0 , die realer Wert 0.0 , die leere Zeichenfolge, das leere Array, der leere Hash, das Zeichen 'F' ]

Also geben die booleschen Operatoren && , || , and und or nicht boolesche Werte zurück. Stattdessen geben sie das erste Objekt zurück, das das Ergebnis des Ausdrucks bestimmt.

(Sie sind auch kurzgeschlossen, was bedeutet, dass sie nur die minimalen Unterausdrücke auswerten, die benötigt werden, um das Ergebnis des Ausdrucks zu bestimmen. Eine alternative Formulierung wäre also, dass sie das Ergebnis des letzten Ausdrucks zurückgeben wurde evaluiert, was wiederum analog ist zu dem, was Blöcke, Methoden, Klassenkörper und Modulkörper tun.)

Also, was bedeutet , um das erste Objekt zurückzugeben, das das Ergebnis bestimmt? Das ist einfach, wirklich: das Ergebnis des Ausdrucks

%Vor%

ist truthy wenn beide a und b truthy sind, andernfalls falsy . Also, wenn a falsy ist, ist es komplett egal was b ist: Das Ergebnis wird falsy sein. Also können wir einfach a zurückgeben. (Denken Sie daran, a muss nicht false sein, es könnte auch nil sein und der Programmierer möchte vielleicht wissen, welcher der beiden es war.)

Wenn, OTOH, a ist truthy (IOW ist es weder nil noch false ), dann ist das Ergebnis des gesamten Ausdrucks ausschließlich abhängig on b : Wenn b truthy ist, wird das ganze Ergebnis truthy sein, andernfalls, wenn b falsy ist, das Ganze Ergebnis wird falsy sein. Also können wir auch b selbst zurückgeben, anstatt es zuerst in einen Booleschen Wert zu konvertieren.

|| und or sind analog oder genauer dual zu && und and .

Sie haben dieses Beispiel gepostet:

%Vor%

Hier erwartet der Autor nicht einmal, dass current_user ein boolescher Wert ist! Stattdessen erwartet er, dass es entweder ein User oder nil ist. Aber das ist vollkommen in Ordnung, denn User ist truthy und nil ist falsy , so dass sie immer noch in einem booleschen Ausdruck verwendet werden können.

Die grundlegende Absicht ist, dass der Autor verhindern will, dass eine NoMethodError -Ausnahme ausgelöst wird, wenn er versucht, #record auf nil aufzurufen.

Eine alternative Möglichkeit, dies auszudrücken, wäre

%Vor%

Wenn Sie alle blutigen Details sehen möchten, sehen Sie sich Abschnitt 11.1 (Seite 36) des Entwurfs an ISO-Ruby-Spezifikation oder die ausführbaren Spezifikationen des RubySpec-Projekts . ( Hier ist der für && .)

Ich habe eine reine Ruby-Implementierung von Booleschen Operatoren und bedingten Ausdrücken von Ruby einmal zum Spaß geschrieben. Der Kern der Implementierungen sind diese zwei mixins .

    
Jörg W Mittag 01.01.2010 14:17
quelle

Tags und Links