Safe navigation operator (&.) für null
Als Ruby 2.3 stellt die Sichere navigation operator(&.
), ein.k.ein einsamer Betreiber, das Verhalten auf nil
Objekt scheint merkwürdig zu sein.
nil.nil? # => true
nil&.nil? # => nil
Ist, dass entwickelt sich zu Verhalten hat, wie dieser Weg? Oder einige edge-Fall, der Weg rutschte, wenn Sie den einsamen Betreiber?
- Nicht klar, warum es scheint seltsam für Sie.
- Warum ist dies besser als mit
try
in Rails? - Ich denke, das ist inspiriert von
try
. - Es ist seltsam, weil die Fragen für
nil?
auf etwas, das offensichtlichnil
(wie das Ergebnis dernil&.
) sollte logisch true zurück, genau wienil.nil?
hat - Die gotcha ist, dass man eigentlich nicht aufrufen
nil?
auf das Ergebnisnil&.
, aber es ist eher ein Teil des ursprünglichen Ausdrucksnil && nil.nil?
, die ignoriert wird in dieser Auswertung, da der erste Teil dieses Ausdrucks istnil
und so gibt. Sehen Oeste Antwort.
InformationsquelleAutor sbs | 2016-01-04
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
foo&.bar
ist die Kurzform fürfoo && foo.bar
, so was würde Sie erwarten, dass das Ergebnis des Ausdrucksnil && nil.nil?
zu werden?foo && foo.bar
. Vielmehr hat(foo == nil) ? nil : foo.bar
, d.h. es prüft nur für die Methode receiver zunil
. Dies ist relevant, wennfoo
istfalse
.Dies ist, weil
nil&.nil?
ist die Kurzform fürnil && nil.nil?
. Dies würde die Auswertungnil && true
, die dannnil
.(nil && x).nil?
immer ausgewertettrue
ist, für jeden Wert vonx
.Während die syntax die macht hat, in diesem konkreten Fall das Potenzial dazu hat, zu einem "gotcha" für Entwickler:
(stuff&.things).nil?
=> Dieser produzierttrue
wenn Sachen nicht vorhanden, oderstuff.things
zurücknil
.vs. unten Fall:
stuff&.things&.nil?
=> Dieser produziertnil
in jedem Fall, außer dem Fall, wostuff.things
gibt etwas anderes alsnil
, in dem Fall würde es wiederfalse
.Aufgrund der Schwierigkeit, im normalen booleschen Logik der Unterscheidung zwischen
false
undnil
es ist unwahrscheinlich, dass dies Sinn machen würde in der normalen Logik.nil && nil.nil?
ausgewertetnil
direkt, dienil.nil?
keine Rolle. Versuchennil && (puts 1)
nichts ausdrucken.&.nil?
, da Sie immer "sicher" zu nennen#nil?
. Tunstuff&.things.nil?
statt.nil
in einem Ausdruck würde zurückfalse
stattnil
dann würde es lösen dieses Problem...