Una spiegazione concisa di nil v. empty v. blank in Ruby on Rails

Mi ritrovo ripetutamente a cercare una chiara definizione delle differenze tra nil?, blank?, e empty? in Ruby on Rails. Ecco il modo in cui mi sono avvicinato di più:

  • Gli oggetti blank? sono falsi, vuoti, o una stringa di spazi bianchi. Per esempio, "", " ", nil, [], e {} sono vuoti.

  • Gli oggetti nil? sono istanze di NilClass.

  • Gli oggetti vuoti sono specifici della classe, e la definizione varia da classe a classe. Una stringa è vuota se non ha caratteri, e un array è vuoto se non contiene elementi.

C'è qualcosa che manca, o un confronto più stretto che può essere fatto?

Soluzione

.nil? può essere usato su qualsiasi oggetto ed è vero se l'oggetto è nullo.

.empty? può essere usato su stringhe, array e hash e restituisce true se:

  • Lunghezza stringa == 0
  • Lunghezza dell'array == 0
  • Lunghezza hash == 0

L'esecuzione di .empty? su qualcosa che è nullo lancia un NoMethodError.

È qui che entra in gioco .blank?. È implementato da Rails e opererà su qualsiasi oggetto e funzionerà come .empty? su stringhe, array e hash.

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? valuta anche true sulle stringhe che non sono vuote ma contengono solo spazi bianchi:

"  ".blank? == true
"  ".empty? == false

Rails fornisce anche .present?, che restituisce la negazione di .blank?.

Array gotcha: blank? restituirà false anche se tutti gli elementi di un array sono vuoti. Per determinare lo spazio vuoto in questo caso, usate all? con blank?, per esempio:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
Commentari (12)

Una differenza è che .nil? e .empty? sono metodi forniti dal linguaggio di programmazione Ruby, mentre .blank? è qualcosa aggiunto dal framework di sviluppo web Rails.

Commentari (0)

Non dimenticate any? che è generalmente !empty?. In Rails tipicamente controllo la presenza di qualcosa alla fine di una dichiarazione con if qualcosa o unless qualcosa poi uso blank? dove necessario dato che sembra funzionare ovunque.

Commentari (2)