it-swarm.com.de

Eine kurze Erklärung von Null vs. Leer vs. Leer in Ruby auf Rails

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?

1075
Arrel

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

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

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 
1383
Corban Brook

Ich habe diese nützliche Tabelle mit allen Fällen gemacht:

enter image description here

blank?, present? werden von Rails bereitgestellt.

650
Julian Popov

Verlängere einfach Julians Tisch:

enter image description here

Ref: leer? Leer? Null? 傻傻 傻傻

204
Sibevin Wang

Schneller Tipp: !obj.blank? == obj.present?

Kann in einigen Ausdrücken nützlich/augenschonend sein

59

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.

48
Andrew Grimm

enter image description here

  • Alles was nil? ist, ist blank?
  • Alles was empty? ist, ist blank?
  • Nichts, was empty? ist, ist nil?
  • Nichts, was nil? ist, ist empty?

tl; dr - Verwenden Sie nur blank? & present?, es sei denn, Sie möchten zwischen "" und " " unterscheiden.

33
steve

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.

13
Alan H

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.

11
davemyron

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.

10
Andy

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.

9
neha

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.

4

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.

3
kelvin

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
2
mahatmanich

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.

1
Chitra