10 Stimmen

Warum kann ich in Ruby nicht "if zero" machen?

>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil

Warum wird der Test gedruckt?

16voto

Nakilon Punkte 33536

Nur in Ruby nil kann als Analogon betrachtet werden zu false . Es besteht keine Vermutung, dass 0 , "" ou [] bedeutet false verwenden, also müssen Sie == 0 , .blank? , .empty? , .zero? などがあります。

Aber nil verhält sich nicht immer wie false . Bei der Interpolation von Zeichenketten zum Beispiel wird die .to_s Methode wird angewendet auf #{} Inhalt, das funktioniert anders für FalseClass y NilClass :

irb(main)> "qwe #{false} rty"
=> "qwe false rty"
irb(main)> "qwe #{nil} rty"
=> "qwe  rty"

6voto

Tony Delroy Punkte 98528

Man kann sich das if in Ruby als Test für einen Booleschen Wert oder für die Verfügbarkeit von Daten (vs nil ). Die implizite Konvertierung von 0 nach false, die von C und (daher auch von anderen Sprachen wie C++) unterstützt wird, war eher ein historisches Artefakt aus der Zeit, bevor C einen eigenen booleschen Typ hatte. Dort beruht sie darauf, dass 0 ein praktischer Sentinel-Wert ist oder eine intuitive Bedeutung hat. Für viele Dinge (z.B. einige Länder, in denen die Kleidergrößen von 0 bis 8 reichen, Ergebnisse von POSIX libC-Funktionsaufrufen) lässt sich Null nicht gut in einen logisch äquivalenten booleschen Wert umwandeln, daher ist es nicht schlecht, dass Ruby seinen eigenen Weg geht.

Aus dieser Perspektive besteht das Problem mit Ihrem Code darin, dass current_user.first_visit - dessen Name einen booleschen Typ impliziert - tatsächlich 0 und nicht false enthält. Hätten Sie alternativ den eindeutig numerischen current_user.visit_counter, wäre es natürlich und korrekt, einen von zu verwenden:

current_user.visit_counter > 0
current_user.visit_counter >= 1
current_user.visit_counter != 0

1voto

Rohit Punkte 5521

Das können Sie versuchen

>> current_user.first_visit
=> 0
>> if current_user.first_visit != 0
>> puts "test"
>> else
>> puts "fail"
>> end
fail
=>nil

Bei der Prüfung auf numerische Werte müssen Sie diese auch mit dem erwarteten Wert abgleichen

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