Ich ertappe mich immer wieder dabei, dass ich nach einer klaren Definition der Unterschiede von "nil", "blank" und "leer" in Ruby on Rails suche. Hier ist das, was dem am nächsten kommt:
blank?
-Objekte sind falsch, leer oder eine Leerzeichenfolge. Zum Beispiel, ""
, " "
, nil
, []
, und {}
sind leer.
"nil"-Objekte sind Instanzen von NilClass.
Leer"-Objekte sind klassenspezifisch, und die Definition variiert von Klasse zu Klasse. Ein String ist leer, wenn er keine Zeichen enthält, und ein Array ist leer, wenn es keine Elemente enthält.
Gibt es etwas, das fehlt, oder einen genaueren Vergleich, der gemacht werden kann?
.nil" kann für jedes Objekt verwendet werden und ist wahr, wenn das Objekt null ist.
.empty?
kann auf Strings, Arrays und Hashes angewendet werden und gibt true zurück, wenn:
Die Ausführung von .empty? auf etwas, das null ist, führt zu einem
NoMethodError`.
An dieser Stelle kommt .blank?
ins Spiel. Es ist von Rails implementiert und funktioniert mit jedem Objekt sowie wie .empty?
mit 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 auf Strings aus, die nicht leer sind, sondern nur Leerzeichen enthalten:
" ".blank? == true
" ".empty? == false
Rails bietet auch .present?
, das die Negation von .blank?
zurückgibt.
Array gotcha: blank?
gibt false
zurück, selbst wenn alle Elemente eines Arrays leer sind. Um die Leerheit in diesem Fall zu bestimmen, verwenden Sie zum Beispiel all?
mit blank?
:
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
Ein Unterschied besteht darin, dass .nil
und .empty
Methoden sind, die von der Programmiersprache Ruby bereitgestellt werden, während .blank
etwas ist, das von dem Webentwicklungs-Framework Rails hinzugefügt stammt.
Vergessen Sie nicht any?
, was im Allgemeinen !empty?
ist. In Rails überprüfe ich typischerweise das Vorhandensein von etwas am Ende einer Anweisung mit if something
oder unless something
und verwende dann blank?
wo nötig, da es überall zu funktionieren scheint.