Ich bin immer wieder auf der Suche nach einer klaren Definition der Unterschiede von nil?
, blank?
und empty?
in Ruby on Rails. Hier ist die nächste, die ich gekommen bin:
blank?
Objekte sind falsch, leer oder eine Whitespace-Zeichenfolge. Beispielsweise sind ""
, " "
, nil
, []
und {}
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 es keine Elemente enthält.
Fehlt etwas oder kann ein genauerer Vergleich durchgeführt werden?
.nil?
kann für jedes Objekt verwendet werden und ist wahr, wenn das Objekt null ist.
.empty?
kann für Zeichenfolgen, Arrays und Hashes verwendet werden und gibt true zurück, wenn:
Wenn Sie .empty?
auf etwas ausführen, das null ist, wird NoMethodError
ausgelöst.
Hier kommt .blank?
ins Spiel. Es ist implementiert von Rails und kann auf jedes Objekt angewendet werden sowie auf Zeichenfolgen, Arrays und Hashes wie .empty?
.
nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false
.blank?
wertet auch true für Zeichenfolgen aus, die nicht leer sind, aber nur Leerzeichen enthalten:
" ".blank? == true
" ".empty? == false
Rails bietet auch.present?
, was die Negation von .blank?
zurückgibt.
Array gotcha: blank?
gibt false
zurück, auch wenn alle Elemente eines Arrays leer sind. Verwenden Sie in diesem Fall all?
mit blank?
, um die Leerheit zu bestimmen. Beispiel:
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
Ich habe diese nützliche Tabelle mit allen Fällen gemacht:
blank?
, present?
werden von Rails bereitgestellt.
Schneller Tipp: !obj.blank? == obj.present?
Kann in einigen Ausdrücken nützlich/augenschonend sein
Ein Unterschied besteht darin, dass .nil?
und .empty?
Methoden sind, die von der Programmiersprache Ruby bereitgestellt werden, während .blank?
etwas hinzugefügt vom Webentwicklungs-Framework Rails ist.
Ein Sonderfall ist, wenn versucht wird, festzustellen, ob ein Boolescher Wert Null ist:
false.present? == false
false.blank? == true
false.nil? == false
In diesem Fall wäre die Empfehlung, .nil?
zu verwenden.
Nur eine kleine Anmerkung zur any?
Empfehlung: Er hat Recht, dass es allgemein äquivalent zu !empty?
ist. any?
gibt jedoch true
an eine Zeichenfolge mit nur Leerzeichen zurück (ala " "
).
Und natürlich auch den obigen 1.9-Kommentar.
Vergessen Sie nicht any?
, was im Allgemeinen !empty?
ist. In Rails überprüfe ich normalerweise das Vorhandensein von etwas am Ende einer Anweisung mit if something
oder unless something
, und verwende dann blank?
, wo dies erforderlich ist, da es anscheinend überall funktioniert.
nil?
ist eine Standardmethode Ruby, die für alle Objekte aufgerufen werden kann und true
zurückgibt, wenn das Objekt nil
ist:
b = nil
b.nil? # => true
empty?
ist eine Standardmethode Ruby, die für einige Objekte wie Strings, Arrays und Hashes aufgerufen werden kann und true
zurückgibt, wenn diese Objekte kein Element enthalten:
a = []
a.empty? # => true
b = ["2","4"]
b.empty? # => false
empty?
kann nicht für nil
Objekte aufgerufen werden.
blank?
ist eine Rails Methode, die sowohl für nil
Objekte als auch für leere Objekte aufgerufen werden kann.
Alle anderen haben gut erklärt, was der Unterschied ist.
Ich möchte in Ruby on Rails hinzufügen, es ist besser, obj.blank?
oder obj.present?
anstelle von obj.nil?
oder obj.empty?
zu verwenden.
obj.blank?
verarbeitet alle Typen nil
, ''
, []
, {}
und gibt true
zurück, wenn keine Werte verfügbar sind, und false
wenn Werte für einen Objekttyp verfügbar sind.
Mit der Methode exists?
kann überprüft werden, ob die Daten in der Datenbank vorhanden sind oder nicht. Es gibt boolesche Werte zurück, entweder true
oder false
.
Schienen 4
eine Alternative zu @ corban-brook's 'Array gotcha: blank?' um zu prüfen, ob ein Array nur leere Werte enthält und als leer angesehen werden kann? wahr:
[ nil, '' ].all? &:blank? == true
man könnte auch tun:
[nil, '', "", " ",' '].reject(&:blank?).blank? == true
nil?
kann für jedes Objekt verwendet werden. Es bestimmt, ob das Objekt einen Wert hat oder nicht, einschließlich 'leerer' Werte.
Zum Beispiel:
example = nil
example.nil? # true
"".nil? # false
Grundsätzlich gibt nil?
nur dann true zurück, wenn das Objekt tatsächlich gleich 'nil' ist.
empty?
wird nur für Objekte aufgerufen, die als Auflistung betrachtet werden. Dies beinhaltet Dinge wie Strings (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:
"".empty? # true
"hi".empty? # false
{}.empty? # true
{"" => ""}.empty? # false
[].empty? # true
[nil].empty? # false
nil.empty? # NoMethodError: undefined method `empty?' for nil:NilClass
Beachten Sie, dass empty?
für keine Objekte aufgerufen werden kann, da keine Objekte eine Auflistung sind und eine Ausnahme auslösen.
Beachten Sie außerdem, dass eine Sammlung nicht leer ist, auch wenn die Elemente in einer Sammlung leer sind.
blank?
ist im Grunde eine Kombination aus nil?
und empty?
. Dies ist nützlich, um Objekte zu überprüfen, von denen Sie annehmen, dass sie Sammlungen sind, sie könnten aber auch null sein.