Zwięzłe wyjaśnienie nil V. empty V. blank w Ruby on Rails

Znajduję się wielokrotnie szukając jasnej definicji różnic w nil?, blank?, i empty? w Ruby on Rails. Oto najbliższy, jaki przybyłem:

  • blank? obiekty są fałszywe, puste lub ciągiem znaków spacji. Na przykład, "", " ", nil, [], i {} są puste.

  • nil? obiekty są instancjami NilClass.

  • empty? obiekty są specyficzne dla danej klasy, a ich definicja różni się w zależności od klasy. Łańcuch jest pusty, jeśli nie zawiera znaków, a tablica jest pusta, jeśli nie zawiera elementów.

Czy czegoś brakuje, czy można dokonać dokładniejszego porównania?

Author: Jonathan Leffler, 2009-05-20

14 answers

.nil? można zastosować na dowolnym obiekcie i jest prawdziwe, jeżeli obiekt jest zerowy.

.empty? może być używany na łańcuchach, tablicach i hashach i zwraca true, jeśli:

  • Długość Łańcucha = = 0
  • długość tablicy = = 0
  • Długość Hasha = = 0

Running .empty? on something that is nil will throw a NoMethodError.

Tutaj wkracza .blank?. Jest zaimplementowane przez Rails i będzie działać na dowolnym obiekcie, jak również działać jak .empty? na łańcuchach, tablicach i hashes.

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

.blank? zwraca również wartość true dla łańcuchów, które nie są puste, ale zawierają tylko białe znaki:

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

Rails zapewnia również .present?, który zwraca negację .blank?.

Tablica: blank? zwróci false, nawet jeśli wszystkie elementy tablicy są puste. Aby określić pustość w tym przypadku, użyj all? z blank?, na przykład:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
 1300
Author: Corban Brook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 11:39:24

Zrobiłem tę użyteczną tabelę ze wszystkimi przypadkami:

Tutaj wpisz opis obrazka

blank?, present? są dostarczane przez szyny.

 596
Author: Julian Popov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-12 16:19:17

Wystarczy rozszerzyć tabelę Juliana:

Tutaj wpisz opis obrazka

Ref: pusty?puste?zero?傻傻分不清楚

 179
Author: Sibevin Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-04 14:09:37

Quick tip: !obj.blank? == obj.present?

Może być przydatny/łatwiejszy dla oczu w niektórych wyrażeniach

 56
Author: Alexander Malfait,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 11:33:23

Jedna różnica polega na tym, że .nil? i .empty? są metodami dostarczanymi przez język programowania Ruby, podczas gdy .blank? jest czymś dodanym przez web development framework Rails.

 43
Author: Andrew Grimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 14:53:41

Tutaj wpisz opis obrazka

  • Wszystko co jest nil? jest blank?
  • Wszystko co jest empty? jest blank?
  • nic co jest empty? nie jest nil?
  • nic, co jest nil? jest empty?

Tl; dr -- tylko używać blank? & present? chyba że chcesz rozróżnić "" i " "

 11
Author: steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 18:17:51

Szczególnym przypadkiem jest próba oceny, czy wartość logiczna jest nil:

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

W tym przypadku zaleca się użycie .nil?

 10
Author: Alan H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 13:56:02

Mała notka o rekomendacji any?: ma rację, że jest ona ogólnie równoważna !empty?. Jednakże, any? zwróci true do ciągu znaków (Ala " ").

I oczywiście Zobacz też komentarz 1.9 powyżej.

 8
Author: davemyron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 19:25:16

Nie zapomnij any? czyli ogólnie !empty?. W Rails zazwyczaj sprawdzam obecność czegoś na końcu instrukcji za pomocą if something lub unless something, a następnie używam blank? tam, gdzie jest to potrzebne, ponieważ wydaje się działać wszędzie.

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-19 23:51:50

nil? jest standardową metodą Ruby, która może być wywołana na wszystkich obiektach i zwraca true jeśli obiekt jest nil:

b = nil
b.nil? # => true

empty? jest standardową metodą Ruby, która może być wywołana na niektórych obiektach, takich jak łańcuchy znaków, tablice i Hasze i zwraca true, jeśli obiekty te nie zawierają elementu:

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

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

empty? nie można wywołać na obiektach nil.

blank? jest metodą Rails, którą można wywołać zarówno na obiektach nil, jak i pustych obiektach.

 6
Author: neha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 18:27:21

Wszyscy inni dobrze wyjaśnili, jaka jest różnica.

Chciałbym dodać w Ruby On Rails, lepiej użyć obj.blank? LUB obj.present? zamiast obj.nil? lub obj.empty?.

obj.blank? obsługuje wszystkie typy nil, '', [], {}, i zwraca true Jeśli wartości nie są dostępne ORAZ Zwraca false jeśli wartości są dostępne dla dowolnego typu obiektu.

 2
Author: Manish Shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 18:25:33

exists? metoda może być zastosowana do sprawdzenia, czy dane istnieją w bazie danych, czy nie. Zwraca wartości logiczne true lub false.

 2
Author: kelvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 19:05:37

Rails 4

Alternatywa dla @corban-brook 'S 'Array gotcha: blank? " do sprawdzania, czy tablica zawiera tylko puste wartości i czy można ją uznać za pustą? prawda:

[ nil, '' ].all? &:blank? == true
Można też zrobić:
[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
 1
Author: mahatmanich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 13:52:27

nil? może być stosowany na dowolnym obiekcie. Określa, czy obiekt ma jakąś wartość, czy nie, włączając w to wartości "puste".

Na przykład:

example = nil
example.nil?  # true

"".nil?  # false

Zasadniczo nil? zwróci true tylko wtedy, gdy obiekt jest w rzeczywistości równy "nil".

empty? jest wywoływana tylko na obiektach, które są uważane za zbiór. Obejmuje to takie rzeczy jak ciągi znaków( zbiór znaków), hasze (zbiór par klucz/wartość) i tablice (zbiór dowolnych obiektów). empty? zwraca true czy w kolekcji nie ma żadnych przedmiotów.

Na przykład:

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

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

Zauważ, że empty? nie można wywołać na obiektach nil, ponieważ obiekty nil nie są kolekcją i spowoduje to wystąpienie wyjątku.

Zauważ również, że nawet jeśli elementy w kolekcji są puste, nie oznacza to, że kolekcja jest pusta.

blank? jest w zasadzie kombinacją nil? i empty? jest przydatna do sprawdzania obiektów, które zakładasz, że są kolekcjami, ale może być również zerowa.

 0
Author: Chitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 18:23:46