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?
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
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:
blank?
, present?
są dostarczane przez szyny.
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
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
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.
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
- Wszystko co jest
nil?
jestblank?
- Wszystko co jest
empty?
jestblank?
- nic co jest
empty?
nie jestnil?
- nic, co jest
nil?
jestempty?
Tl; dr -- tylko używać blank?
& present?
chyba że chcesz rozróżnić ""
i " "
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?
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.
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.
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.
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.
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
.
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
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.
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