Ich finde ich immer wieder für eine klare Definition der Unterschiede zu suchen nil?
, blank?
und empty?
in Ruby on Rails. Hier ist der nächste, den ich gekommen bin:
blank?
Objekte sind falsch, leer oder eine Leerzeichenfolge. Zum Beispiel""
," "
,nil
,[]
, und{}
sind leer.nil?
Objekte sind Instanzen von NilClass.empty?
Objekte sind klassenspezifisch und die Definition variiert von Klasse zu Klasse. Eine Zeichenfolge ist leer, wenn sie keine Zeichen enthält, und ein Array ist leer, wenn sie keine Elemente enthält.
Fehlt etwas oder kann ein genauerer Vergleich durchgeführt werden?
ruby-on-rails
ruby
Arrel
quelle
quelle
present?
. Dies liegt daranblank?
, dass für ein leeres Array true zurückgegeben wird.:nil?
ist definiert auf::Kernel
und außer Kraft gesetzt auf::NilClass
, während:empty?
umgesetzt wird separat auf vielen Klassen (nativ auf::String
,::Array
,::Hash
und nicht nativ auf anderen Klassen wie::Set
aus stdlib und::ActiveRecord::Relation
von Schienen). Ist:nil?
also in allen Unterklassen von::Object
und auch in jeder Klasse verfügbar , die::Kernel
für sich selbst enthält, wo:empty?
sie implementiert oder speziell in Ihre Klassen aufgenommen werden muss.nil
Konzept zu verstehen, beginnen Sie hier .[1] pry(main)> [].blank? => true
Antworten:
.nil?
kann für jedes Objekt verwendet werden und ist wahr, wenn das Objekt Null ist..empty?
kann für Strings, Arrays und Hashes verwendet werden und gibt true zurück, wenn:Wenn Sie
.empty?
auf etwas laufen , das gleich Null ist, wird a geworfenNoMethodError
.Hier
.blank?
kommt es ins Spiel . Es wird von Rails implementiert und funktioniert mit jedem Objekt sowie mit.empty?
Strings, Arrays und Hashes..blank?
wertet true auch für Zeichenfolgen aus, die nicht leer sind, aber nur Leerzeichen enthalten:Rails bietet auch
.present?
, was die Negation von zurückgibt.blank?
.Array gotcha: Gibt
blank?
zurück,false
auch wenn alle Elemente eines Arrays leer sind. Um zu bestimmen , Geistlosigkeit in diesem Fall der Verwendungall?
mitblank?
, zum Beispiel:quelle
false.blank? == true
presence
!Ich habe diese nützliche Tabelle mit allen Fällen erstellt:
blank?
,present?
Sind durch Schienen vorgesehen.quelle
any?
wenn Sie die Tabelle jemals aktualisieren.blank?
undpresent?
sind nicht "nur Rails ", sondern werden automatisch von Rails aufgenommen, können jedoch mithilfe der Core-Erweiterungen von ActiveSupport problemlos in Nicht-Rails-Code aufgenommen werden. Siehe stackoverflow.com/questions/4238867/…Erweitern Sie einfach Julians Tisch:
Ref: leer? Leer? Null? 傻傻 分不清楚
quelle
Enumerable#any?
ist Vanille Ruby, es sollte nicht unter "Nur Schienen" aufgeführt werden.zero?
und.nonzero?
Kurzer Tipp:
!obj.blank? == obj.present?
Kann in einigen Ausdrücken praktisch / augenschonender sein
quelle
present?
ist Teil von active_support. Überprüfen Sie hier, was enthalten sein soll, um es zu erhalten: stackoverflow.com/a/4648704/1569!!false
Ein Unterschied besteht darin , dass
.nil?
und.empty?
Methoden sind, die von der Programmiersprache zur Verfügung gestellt werden , Rubin, während.blank?
etwas hinzugefügt durch den Web - Entwicklungs - Framework Rails.quelle
nil?
istblank?
empty?
istblank?
empty?
istnil?
nil?
istempty?
tl; dr - verwenden Sie nur
blank?
&, espresent?
sei denn, Sie möchten zwischen""
und unterscheiden" "
quelle
Ein Sonderfall ist der Versuch, festzustellen, ob ein Boolescher Wert Null ist:
In diesem Fall wäre die Empfehlung zu verwenden
.nil?
quelle
Nur eine kleine Anmerkung zur
any?
Empfehlung: Er hat Recht, dass es im Allgemeinen gleichbedeutend ist mit!empty?
. Kehrtany?
jedochtrue
zu einer Zeichenfolge mit nur Leerzeichen (ala" "
) zurück.Und natürlich auch den obigen Kommentar 1.9.
quelle
Vergiss nicht,
any?
was allgemein ist!empty?
. In Rails überprüfe ich normalerweise das Vorhandensein von etwas am Ende einer Anweisung mitif something
oder verwende esunless something
dann,blank?
wo es benötigt wird, da es anscheinend überall funktioniert.quelle
any?
bei der Überprüfung der Nichtleere. Es gibt false zurück, wenn Sie ein Array von falschen Werten haben. Eine Möglichkeit, dies zu umgehen, besteht darin, einen immer zutreffenden Block zu übergeben :[nil, false].any?{ true }
, der jedoch!empty?
kürzer ist und Sie sich nicht an das seltsame Verhalten erinnern können.nil?
ist eine Standard-Ruby-Methode, die für alle Objekte aufgerufen werden kann und zurückgibt,true
wenn das Objektnil
:empty?
ist eine Standard-Ruby-Methode, die für einige Objekte wie Strings, Arrays und Hashes aufgerufen werden kann und zurückgegeben wird,true
wenn diese Objekte kein Element enthalten:empty?
kann nicht fürnil
Objekte aufgerufen werden.blank?
ist eine Rails-Methode, die sowohl fürnil
Objekte als auch für leere Objekte aufgerufen werden kann .quelle
Alle anderen haben gut erklärt, was der Unterschied ist.
Ich möchte Ruby On Rails hinzufügen, es ist besser,
obj.blank?
oderobj.present?
anstelle vonobj.nil?
oder zu verwendenobj.empty?
.obj.blank?
Griffe alle Artennil
,''
,[]
,{}
, und kehrt ,true
wenn Werte nicht zur Verfügung und kehrt sind ,false
wenn Werte auf jede Art von Objekt zur Verfügung stehen.quelle
exists?
Mit dieser Methode kann überprüft werden, ob die Daten in der Datenbank vorhanden sind oder nicht. Es gibt entwedertrue
oder boolesche Werte zurückfalse
.quelle
Schienen 4
eine Alternative zu @ corban-brooks 'Array gotcha: blank?' um zu überprüfen, ob ein Array nur leere Werte enthält und als leer angesehen werden kann? wahr:
man könnte auch tun:
quelle
nil?
kann für jedes Objekt verwendet werden. Es bestimmt, ob das Objekt einen Wert hat oder nicht, einschließlich 'leerer' Werte.Zum Beispiel:
Grundsätzlich
nil?
wird nur dann true zurückgegeben, wenn das Objekt tatsächlich gleich 'nil' ist.empty?
wird nur für Objekte aufgerufen, die als Sammlung betrachtet werden. Dazu gehören Zeichenfolgen (eine Sammlung von Zeichen), Hashes (eine Sammlung von Schlüssel / Wert-Paaren) und Arrays (eine Sammlung von beliebigen Objekten).empty?
Gibt true zurück, wenn sich keine Elemente in der Sammlung befinden.Zum Beispiel:
Beachte das
empty?
nil-Objekte nicht aufgerufen werden können, da nil-Objekte keine Sammlung sind und eine Ausnahme auslösen.Beachten Sie auch, dass selbst wenn die Elemente in einer Sammlung leer sind, dies nicht bedeutet, dass eine Sammlung leer ist.
blank?
ist im Grunde eine Kombination ausnil?
undempty?
Es ist nützlich, um Objekte zu überprüfen, von denen Sie annehmen, dass sie Sammlungen sind, könnte aber auch Null sein.quelle