>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil
Warum wird der Test gedruckt?
>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil
Warum wird der Test gedruckt?
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"
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
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.