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




ruby on rails tutorial (12)

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?


  • Tutto ciò che è nil? è blank?
  • Tutto ciò che è empty? è blank?
  • Niente di ciò che è empty? è nil?
  • Niente che sia nil? è empty?

tl; dr - usa solo blank? e present? a meno che tu non voglia distinguere tra "" e " "


exists? metodo può essere usato per verificare se i dati esistono nel database o meno. Restituisce valori booleani sia true che false .


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

.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 

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


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?


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.


Non dimenticare any? che è generalmente !empty? . In Rails, in genere, controllo la presenza di qualcosa alla fine di una dichiarazione con if something o a unless something poi non usi blank? dove necessario poiché sembra funzionare ovunque.


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.



Tutti gli altri hanno spiegato bene qual è la differenza.

Vorrei aggiungere Ruby On Rails, è meglio usare obj.blank? o obj.present? invece di obj.nil? o obj.empty? .

obj.blank? gestisce tutti i tipi nil , '' , [] , {} e restituisce true se i valori non sono disponibili e restituisce false se i valori sono disponibili su qualsiasi tipo di oggetto.







ruby