2012-10-03 10 views
11

nil || false gibt false zurück und false || nil gibt nil zurück. Hat jemand eine Erklärung dafür?null || falsch und falsch || Null in Rubin

+0

Für Bonuspunkte erklären warum 'nil || falsch und falsch || nil' ergibt false – pguardiario

+0

@pguardiario http://stackoverflow.com/questions/1840488/operator-precedence-for-and-in-ruby – x1a4

Antwort

16

In Ruby ist alles ein Ausdruck, und ein Ausdruck gibt den letzten Wert zurück, der darin ausgewertet wird.

Für beide Beispiele wird die linke Seite des || Ausdrucks zu einem falschen Wert ausgewertet, also wertet Ruby die rechte Seite aus und gibt sie zurück.

+0

Ihre Erklärung ist wirklich klar, danke! – user1538814

3

|| gibt das Ergebnis des letzten ausgewerteten Ausdrucks zurück. Wenn es die LHS auswertet und einen true Wert findet, erhalten Sie die LHS; Andernfalls erhalten Sie die RHS (egal, was diese RHS sein könnte).

+0

Das war eine wirklich gute Erklärung, danke! – user1538814

4

Wie die anderen darauf hingewiesen haben, wertet || zuerst den Ausdruck auf der linken Seite aus. Wenn es "wahr" ist (alles außer false oder nil), gibt es das zurück. Andernfalls wertet es den Ausdruck auf der rechten Seite aus und gibt ihn zurück (egal, was es ist).

Dies macht || nützlich für viel mehr als nur boolesche Tests. Zum Beispiel habe ich es nur den anderen Tag, wenn einige Codes für die chronic gem Schreiben:

@now = options[:now] || Chronic.time_class.now 

Das bedeutet: „Wenn der options Hash einen :now Wert enthält, zu speichern, die in @now Ansonsten fallen zurück auf Chronic.time_class.now. als Standard ". Ich bin sicher, dass Sie viele mögliche Anwendungen in Ihren eigenen Programmen finden können.

&& ist analog: Es bewertet zuerst den Ausdruck auf der linken Seite, und wenn es false oder nil auswertet, gibt es das zurück. Andernfalls wertet es den Ausdruck auf der rechten Seite aus und gibt ihn zurück (egal, was es ist).

Dies bedeutet && ist auch nützlich für viel mehr als nur boolesche Tests. Sie können es verwenden, um zwei Codezeilen in eine zu komprimieren. Zum Beispiel:

do_something && do_something_else 

(Das nur, dass der Rückgabewert von do_something nie sein wird false oder nil wenn Sie wissen, funktioniert!)

Sie auch && quetschen ein „Wächter“ Ausdruck auf derselben verwenden können Linie als das, was es ist "Bewachung":

unless message.nil? 
    send_message(message) 
end 
:

message && send_message(message) 

welche ersetzen könnte

+0

Ich lerne immer noch Rubin, aber das ist wirklich hilfreich. – user1538814

Verwandte Themen