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?
.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:
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
Una differenza è che .nil?
e .empty?
sono metodi forniti dal linguaggio di programmazione Ruby, mentre .blank?
è qualcosa aggiunto dal framework di sviluppo web Rails.
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.