present - Eine knappe Erklärung von nil v. Leer v. Blank in Ruby on Rails
ruby not nil (10)
Ich bin immer wieder auf der Suche nach einer klaren Definition der Unterschiede von nil?
, blank?
und empty?
in Ruby auf Schienen. Hier ist der nächste, dem ich gekommen bin:
blank?
Objekte sind falsch, leer oder eine Whitespace-Zeichenfolge. Zum Beispiel 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 ist ein engerer Vergleich möglich?
Alle anderen haben gut erklärt, was der Unterschied ist.
Ich möchte in Ruby On Rails hinzufügen, ist es besser, obj.blank?
zu verwenden obj.blank?
oder obj.present?
statt obj.nil?
oder obj.empty?
.
obj.blank?
behandelt alle Typen nil
, ''
, []
, {}
und gibt true
zurück true
wenn Werte nicht verfügbar sind, und gibt false
wenn Werte für einen beliebigen Objekttyp verfügbar sind.
Ich habe diese nützliche Tabelle mit allen Fällen gemacht:
Schienen 4
eine Alternative zu @ Corban-Brooks 'Array gotcha: leer?' um zu überprü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
Schneller Tipp !obj.blank? == obj.present?
!obj.blank? == obj.present?
Kann in einigen Ausdrücken nützlich / einfacher auf die Augen sein
.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:
- Stringlänge == 0
- Arraylänge == 0
- Hashlänge == 0
.empty?
auf etwas, das Null ist, wird einen NoMethodError
werfen.
Das ist wo .blank?
kommt herein. Es wird von Rails implementiert und wird auf jedem Objekt funktionieren und funktioniert wie .empty?
auf Strings, Arrays und Hashes.
nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false
.blank?
wertet auch true für Strings aus, die nicht leer sind, aber nur Leerzeichen enthalten:
" ".blank? == true
" ".empty? == false
Rails bietet .present?
, die die Negation von .blank?
.
Array gotcha: blank?
wird false
auch wenn alle Elemente eines Arrays leer sind. Um in diesem Fall die Leerstelle zu bestimmen, verwenden Sie all?
mit blank?
, beispielsweise:
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
nil?
Kann für jedes Objekt verwendet werden. Es bestimmt, ob das Objekt einen Wert hat oder nicht, einschließlich 'leere' Werte.
Beispielsweise:
example = nil
example.nil? # true
"".nil? # false
Im Grunde nil?
wird immer nur wahr zurückgeben, wenn das Objekt tatsächlich gleich 'Null' ist.
empty?
wird nur für Objekte aufgerufen, die als Sammlung betrachtet werden. Dazu gehören 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 keine Objekte in der Sammlung vorhanden sind.
Beispielsweise:
"".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?
kann nicht für nil-Objekte aufgerufen werden, da nil-Objekte keine Sammlung sind und eine Ausnahme auslösen.
Beachten Sie außerdem, dass die Auflistung nicht leer ist, auch wenn die Elemente in einer Auflistung leer sind.
blank?
ist im Grunde eine Kombination von nil?
und empty?
Es ist nützlich, um Objekte zu überprüfen, von denen Sie annehmen, dass sie Sammlungen sind, aber auch Null sein könnten.
nil?
ist eine Ruby-Standardmethode, die für alle Objekte aufgerufen werden kann und true
zurückgibt true
wenn das Objekt nil
:
b = nil
b.nil? # => true
empty?
ist eine Ruby-Standardmethode, die für einige Objekte wie Strings, Arrays und Hashes aufgerufen werden kann und true
zurückgibt true
wenn diese Objekte kein Element enthalten:
a = []
a.empty? # => true
b = ["2","4"]
b.empty? # => false
empty?
kann auf keine Objekte aufgerufen werden.
blank?
ist eine Rails-Methode, die sowohl für leere Objekte als auch für leere Objekte aufgerufen werden kann.