Znalazłem się wielokrotnie szuka jasnego zdefiniowania różnic nil?
, blank?
oraz empty?
w Ruby on Rails. Oto najbliższy, jaki przyszedłem:
blank?
obiekty są fałszywe, puste lub zawierają spacje. Na przykład""
," "
,nil
,[]
, i{}
są puste.nil?
obiekty są instancjami NilClass.empty?
obiekty są specyficzne dla klasy, a definicja różni się w zależności od klasy. Łańcuch jest pusty, jeśli nie ma znaków, a tablica jest pusta, jeśli nie zawiera żadnych elementów.
Czy brakuje czegoś lub dokładniejszego porównania?
ruby-on-rails
ruby
Arrel
źródło
źródło
present?
. A to dlatego, żeblank?
zwraca wartość true dla pustej tablicy.:nil?
jest określona na::Kernel
i nadpisane na::NilClass
, podczas gdy:empty?
jest realizowany oddzielnie na wielu zajęciach (natywnie na::String
,::Array
,::Hash
, i nie natywnie w innych klasach, takich jak::Set
od stdlib oraz::ActiveRecord::Relation
z szyn).:nil?
Jest więc dostępny we wszystkich podklasach,::Object
a także we wszystkich klasach, które::Kernel
same w sobie obejmują, gdzie:empty?
należy je zaimplementować lub uwzględnić w swoich klasach.nil
koncepcję, zacznij tutaj .[1] pry(main)> [].blank? => true
Odpowiedzi:
.nil?
może być używany na dowolnym obiekcie i jest prawdą, jeśli obiekt jest zerowy..empty?
może być stosowany do ciągów, tablic i skrótów i zwraca wartość true, jeśli:Bieganie
.empty?
na czymś zerowym rzuciNoMethodError
.W tym momencie
.blank?
pojawia się. Jest on implementowany przez Railsy i będzie działał na każdym obiekcie, a także będzie działał jak.empty?
na ciągach, tablicach i skrótach..blank?
sprawdza również wartość true dla ciągów, które nie są puste, ale zawierają tylko białe znaki:Railsy również zapewniają
.present?
, co zwraca negację.blank?
.Tablica gotcha:
blank?
zwrócifalse
nawet jeśli wszystkie elementy tablicy są puste. Aby ustalić, pustka w tym przypadku korzystaniaall?
zblank?
, na przykład:źródło
false.blank? == true
presence
!Zrobiłem tę przydatną tabelę ze wszystkimi przypadkami:
blank?
,present?
są dostarczane przez Rails.źródło
any?
jeśli kiedykolwiek zaktualizujesz tabelę.blank?
ipresent?
nie są „ tylko Railsami ”, są one automatycznie uwzględniane przez Railsy, ale można je łatwo włączyć do kodu innego niż Railsy przy użyciu rozszerzeń Core ActiveSupport. Zobacz stackoverflow.com/questions/4238867/…Po prostu przedłuż stół Juliana:
Ref: pusta? Pusta? Zerowa? 傻傻 分不清楚
źródło
Enumerable#any?
jest waniliowy Ruby, nie należy go umieszczać w „tylko szynach”.zero?
i.nonzero?
Szybka wskazówka:
!obj.blank? == obj.present?
Może być przydatny / łatwiejszy dla oczu w niektórych wyrażeniach
źródło
present?
jest częścią active_support, sprawdź tutaj, co należy zrobić, aby go zdobyć: stackoverflow.com/a/4648704/1569!!false
Jedną różnicą jest to
.nil?
i.empty?
są metodami, które są przewidziane przez język programowania Ruby, natomiast.blank?
jest coś dodane przez framework Rails tworzenie stron internetowych.źródło
nil?
jestblank?
empty?
jestblank?
empty?
jestnil?
nil?
jestempty?
tl; dr - używaj tylko
blank?
&,present?
chyba że chcesz rozróżnić między""
i" "
źródło
Szczególnym przypadkiem jest próba oceny, czy wartość logiczna wynosi zero:
W takim przypadku zaleca się użycie
.nil?
źródło
Mała uwaga na temat
any?
zalecenia: ma rację, że ogólnie jest to odpowiednik!empty?
. Jednakany?
powrócitrue
do ciągu zaledwie spacji (ALA" "
).I oczywiście patrz też komentarz 1.9 powyżej.
źródło
Nie zapomnij,
any?
co jest ogólnie!empty?
. W Railsach zazwyczaj sprawdzam obecność czegoś na końcu instrukcji za pomocą,if something
aunless something
następnie używamblank?
tam, gdzie jest to potrzebne, ponieważ wydaje się, że działa wszędzie.źródło
any?
sprawdzaj brak pustki. Zwraca false, jeśli masz tablicę wartości fałszowania. Sposobem na obejście tego jest ominięcie zawsze prawdziwego bloku:[nil, false].any?{ true }
ale!empty?
jest krótszy i nie pamiętasz dziwnego zachowania.nil?
jest standardową metodą Ruby, którą można wywoływać dla wszystkich obiektów i zwraca,true
jeśli obiekt tonil
:empty?
jest standardową metodą Ruby, którą można wywoływać dla niektórych obiektów, takich jak Strings, Arrays i Hashes, i zwraca,true
jeśli te obiekty nie zawierają elementu:empty?
nie można wezwaćnil
obiektach.blank?
jest metodą Railsową, którą można wywoływać zarówno nanil
obiektach, jak i pustych obiektach.źródło
Wszyscy inni dobrze wyjaśnili, jaka jest różnica.
Chciałbym dodać Ruby On Rails, lepiej użyć
obj.blank?
lubobj.present?
zamiastobj.nil?
lubobj.empty?
.obj.blank?
obsługuje wszystkie typynil
,''
,[]
,{}
, i powrotytrue
jeśli wartości nie są dostępne i powrotyfalse
jeżeli dostępne są na wszelkiego rodzaju obiektu wartości.źródło
exists?
Można użyć metody do sprawdzenia, czy dane istnieją w bazie danych, czy nie. Zwraca wartości logiczne albotrue
albofalse
.źródło
Szyny 4
alternatywa dla „Array gotcha: blank?” @ corban-brook do sprawdzania, czy tablice zawierają tylko puste wartości i czy można je uznać za puste? prawdziwe:
można również zrobić:
źródło
nil?
może być używany na dowolnym obiekcie. Określa, czy obiekt ma jakąkolwiek wartość, czy nie, w tym wartości „puste”.Na przykład:
Zasadniczo
nil?
zwróci prawdę tylko wtedy, gdy obiekt jest w rzeczywistości równy „zero”.empty?
jest wywoływany tylko dla obiektów, które są uważane za kolekcję. Obejmuje to między innymi ciągi znaków (zbiór znaków), skróty (zbiór par klucz / wartość) i tablice (zbiór dowolnych obiektów).empty?
zwraca true, jeśli nie ma żadnych elementów w kolekcji.Na przykład:
Zauważ, że
empty?
nie można wywoływać obiektów zerowych, ponieważ obiekty zerowe nie są kolekcją i spowoduje to wyjątek.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?
iempty?
Przydaje się do sprawdzania obiektów, które zakładamy, że są kolekcjami, ale mogą również być zerowe.źródło