tutorial - Una spiegazione concisa di nil v. Empty v. Blank in Ruby on Rails




ruby on rails tutorial (10)

Estendi solo il tavolo di Julian:

Rif: empty?blank?nil?傻傻分不清楚

Mi trovo ripetutamente alla ricerca di una chiara definizione delle differenze di nil? blank? e empty? in Ruby on Rails. Ecco il più vicino sono venuto:

  • blank? gli oggetti sono falsi, vuoti o una stringa di spaziatura. Ad esempio, "" , " " , nil , [] e {} sono vuoti.

  • nil? gli oggetti sono istanze di NilClass.

  • empty? gli oggetti sono specifici della classe e la definizione varia da classe a classe. Una stringa è vuota se non ha caratteri e una matrice è vuota se non contiene elementi.

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


Ho creato questa tabella utile con tutti i casi:

blank? present? sono forniti da Rails.


Rotaie 4

un'alternativa a @ Array gotcha di @ corban-brook : blank? per verificare se un array contiene solo valori vuoti e può essere considerato come vuoto? vero:

[ nil, '' ].all? &:blank? == true

si potrebbe anche fare:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true

Solo una piccola nota a riguardo any? raccomandazione: ha ragione che è generalmente equivalente a !empty? . Tuttavia, any? restituirà true a una stringa di soli spazi bianchi (ala " " ).

E, naturalmente, vedi anche il commento 1.9 sopra.


Un caso speciale è quando si tenta di valutare se un valore booleano è nullo:

false.present? == false
false.blank? == true
false.nil? == false

In questo caso la raccomandazione sarebbe quella di usare .nil?


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


!obj.blank? == obj.present? rapido !obj.blank? == obj.present? !obj.blank? == obj.present?

Può essere utile / più facile per gli occhi in alcune espressioni


.nil? può essere utilizzato su qualsiasi oggetto ed è vero se l'oggetto è zero.

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

  • Lunghezza stringa == 0
  • Lunghezza array == 0
  • Lunghezza hash == 0

In esecuzione .empty? su qualcosa che è nullo genererà un NoMethodError .

È qui che .blank? entra. È implementato da Rails e funzionerà su qualsiasi oggetto e funzionerà come .empty? su archi, matrici e hash.

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

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

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

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

Getcha Array: blank? restituirà false anche se tutti gli elementi di una matrice sono vuoti. Per determinare lo spazio vuoto in questo caso, usa all? con blank? , per esempio:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 

nil? è un metodo standard di Ruby che può essere chiamato su tutti gli oggetti e restituisce true se l'oggetto è nil :

b = nil
b.nil? # => true

empty? è un metodo standard di Ruby che può essere chiamato su alcuni oggetti come Stringhe, Array e Hash e restituisce true se questi oggetti non contengono alcun elemento:

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty? non può essere chiamato su oggetti nil .

blank? è un metodo Rails che può essere chiamato su oggetti nil oggetti vuoti.


nil? può essere utilizzato su qualsiasi oggetto. Determina se l'oggetto ha un valore o meno, compresi i valori "vuoti".

Per esempio:

example = nil
example.nil?  # true

"".nil?  # false

Fondamentalmente nil? restituirà sempre true solo se l'oggetto è in realtà uguale a 'nil'.

empty? viene chiamato solo su oggetti considerati una raccolta. Questo include cose come stringhe (una collezione di caratteri), hash (una collezione di coppie chiave / valore) e array (una raccolta di oggetti arbitrari). empty? ritorna vero non ci sono elementi nella collezione.

Per esempio:

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

Si noti che empty? non può essere chiamato su oggetti nil poiché gli oggetti nil non sono una collezione e solleverà un'eccezione.

Si noti inoltre che anche se gli elementi di una raccolta sono vuoti, ciò non significa che una raccolta è vuota.

blank? è fondamentalmente una combinazione di nil? e empty? È utile per controllare gli oggetti che si presume siano raccolte, ma potrebbe anche essere nullo.





ruby