O explicație concisă nulă v. gol v. gol în Ruby on Rails

Mă găsesc în mod repetat în căutarea pentru o definiție clară a diferențelor dintre nil?,gol?, șigol?` în Ruby on Rails. Aici's cel mai aproape am'am venit:

  • gol? obiectele sunt false, gol, sau un spațiu șir. De exemplu, "", " ", nil, [], și {} sunt goale.

  • nule?` obiectele sunt instanțe ale NilClass.

  • gol? obiecte sunt specifice fiecărei clase, și definiția diferă de la clasă la clasă. Un șir este gol dacă nu are personaje, și o matrice este goală dacă nu conține elemente.

Lipsește ceva, sau mai comparație care poate fi făcut?

Comentarii la întrebare (4)
Soluția

.nil? poate fi folosit pe orice obiect si este true dacă obiectul este zero.

.gol? poate fi folosit pe siruri de caractere, tablouri și hash-uri și întoarce true dacă:

  • String length == 0
  • Matrice length == 0
  • Hash length == 0

De funcționare .gol? pe ceva care este zero va arunca oNoMethodError`.

Că este de unde.gol?vine. Este [implementată de Șine][1] și va funcționa pe orice obiect, precum și de lucru ca.gol? pe siruri de caractere, tablouri și hash-uri.

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

.gol?, de asemenea, evaluează adevărat pe siruri de caractere care sunt non-gol, dar conține numai spații albe:

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

Șine oferă, de asemenea, .prezent?, care revine la o negare a .gol?.

Array te-am prins: gol? va reveni "false", chiar dacă toate elemente de-o matrice sunt goale. Pentru a determina vid în acest caz, utilizați toate? " cu " gol?`, de exemplu:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
Comentarii (12)

Am făcut acest lucru util tabel cu toate cazurile:

gol?, `prezent? sunt furnizate de Șine.

Comentarii (3)

Sfat rapid: !obj.gol? == obj.prezent?

Poate fi util/mai ușor de pe ochi în unele expresii

Comentarii (6)

O diferență este că.nil? "și".gol?sunt metode care sunt oferite de limbajul de programare Ruby, întrucât.gol?` este ceva adaugat de cadru de dezvoltare web Șine.

Comentarii (0)

  • Tot ceea ce este zero? "este" gol?
  • Tot ceea ce este gol? "este" gol?
  • Nimic din ceea ce este gol? "este" zero?
  • Nimic din ceea ce este zero? "este" gol?

tl;dr-doar folosi gol? & prezent? dacă nu doriți să se facă distincția între"" " și " " "`

Comentarii (1)

Un caz special este atunci când încearcă pentru a evalua dacă o valoare booleană este nulă:

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

În acest caz, recomandarea ar fi să-l folosiți.nil?`

Comentarii (0)

Doar o mica nota despre orice?recomandare: El's chiar că-l's *în general* echivalent cu!gol?. Cu toate acestea, orice? va returna "true" la un șir de doar spațiu (ala " ").

Și, desigur, a se vedea 1.9 comentariul de mai sus, de asemenea.

Comentarii (1)

Don't uita de orice?care este, în general!gol?. În Șine eu de obicei verificați pentru prezența de ceva de la sfârșitul de o declarație cudacă ceva " sau " dacă ceva apoi utilizați gol? acolo unde este nevoie, deoarece se pare să funcționeze peste tot.

Comentarii (2)

nil este un standard Ruby metodă care poate fi numit pe toate obiectele și returnează "true" dacă obiectul este "zero":

b = nil
b.nil? # => true

gol? este un standard Ruby metodă care poate fi numit pe unele obiecte, cum ar fi Siruri de caractere, Tablouri și Hash-uri și returnează "true" dacă aceste obiecte nu conțin niciun element:

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

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

gol? nu poate fi numit "zero" obiecte.

gol? este o Șine metodă care poate fi numit pe "zero" obiecte precum și gol obiecte.

Comentarii (0)

Toată lumea le-a explicat bine ce este diferența.

Aș dori să adaug în Ruby On Rails, este mai bine să utilizați obj.gol? " sau " obj.prezent? "în loc de" obj.nil? " sau " obj.gol?.

obj.gol? se ocupă de toate tipurile de nil,'',[],{}`, și returnează "true" dacă nu sunt disponibile valori și returnează "false" daca valorile sunt disponibile pe orice tip de obiect.

Comentarii (0)

există? metodă poate fi utilizată pentru a verifica dacă există date în baza de date sau nu. Returnează valori booleene fie "adevărat" sau "fals".

Comentarii (1)

Șine 4

o alternativă la @corban-brook 's 'Matrice te-am prins: gol?' pentru a verifica dacă o matrice are doar valori goale și poate fi considerată ca martor? adevărat:

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

de asemenea, se poate face:

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

nil? poate fi folosit pe orice obiect. Se determină dacă obiectul are vreo valoare sau nu, inclusiv 'gol' valorile.

De exemplu:

example = nil
example.nil?  # true

"".nil?  # false

Practic nule?` va mai întoarce true dacă obiectul este de fapt egal cu 'nil'.

gol? este doar numit pe obiecte care sunt considerate o colecție. Aceasta include lucruri cum ar fi siruri de caractere (o colecție de caractere), hash-uri (o colectie de perechi cheie/valoare) și matrice (o colecție de obiecte arbitrare). gol? returnează adevărat este că nu există elemente în colecție.

De exemplu:

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

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

Observați că gol? poate't fi numit pe nil obiecte ca nil obiecte nu sunt o colecție și se va ridica o excepție.

De asemenea, observați că, chiar dacă elementele dintr-o colecție sunt goale, aceasta nu înseamnă o colecție este gol.

gol? este de fapt o combinație de nil? " și " gol? L's util pentru verificarea obiecte pe care le presupune sunt colecții, dar ar putea fi, de asemenea, zero.

Comentarii (0)