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 class e la definizione varia da class a class. 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?
.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:
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:
blank?
present?
sono forniti da Rails.
Estendi solo il tavolo di Julian:
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?
nil?
è blank?
empty?
è blank?
empty?
è nil?
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.