Eine kurze Erklärung von nil vs. empty vs. blank in Ruby on Rails

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?

Lösung

.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:

  • Stringlänge == 0
  • Array-Länge == 0
  • Hash-Länge == 0

Die Ausführung von .empty? auf etwas, das null ist, führt zu einemNoMethodError`.

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 
Kommentare (12)

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.

Kommentare (0)

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.

Kommentare (2)