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

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:

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

.nil? può essere utilizzato su qualsiasi object ed è vero se l’object è 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 object 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 

Ho creato questa tabella utile con tutti i casi:

inserisci la descrizione dell'immagine qui

blank? present? sono forniti da Rails.

Estendi solo il tavolo di Julian:

inserisci la descrizione dell'immagine qui

Rif: vuoto? Vuoto? Nil? 傻傻 分不清楚

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

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

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

inserisci la descrizione dell'immagine qui

  • 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 " "

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.

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.

nil? è un metodo standard di Ruby che può essere chiamato su tutti gli oggetti e restituisce true se l’object è 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.

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

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 object. Determina se l’object 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’object è 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.