Ruby'de boş ve boş nil nasıl anlaşılır


1129

Kendimi defalarca farklarının net bir tanım arayan bulmak nil?, blank?ve empty?Ruby on Rails. İşte en yakın geldiğim:

  • blank?nesneler yanlış, boş veya boşluk dizesidir. Örneğin, "", " ", nil, [], ve {}boş.

  • nil? nesneleri NilClass örneğidir.

  • empty?nesneler sınıfa özeldir ve tanım sınıftan sınıfa değişir. Bir karakter içermiyorsa bir dize, öğe içermiyorsa bir dizi boştur.

Eksik bir şey veya yapılabilecek daha sıkı bir karşılaştırma var mı?


26
Bir gotcha boş bir dizi için false döndürür present?. Bunun nedeni blank?boş bir dizi için true değerini döndürmesidir.
Kris

4
Güzel bir şey olduğunu görmek için :nil?tanımlanır ::Kernelve üzerinde geçersiz ::NilClassiken, :empty?birçok sınıflara ayrı ayrı uygulanır (doğal olarak üzerine ::String, ::Array, ::Hash, ve non-doğal gibi diğer sınıflara ::Setstdlib gelen ve ::ActiveRecord::Relationraylar itibaren). Bu nedenle :nil?, kendi ::Objectsınıfını içeren ::Kernelve :empty?özellikle sınıflarınıza uygulanması gereken ya da dahil edilmesi gereken her sınıfın tüm alt sınıflarında mevcuttur.
yeniden yazıldı

Tüm nilkonsepti anlamaya çalışırsanız buradan başlayın .
totymedli

[1] pry(main)> [].blank? => true
Michael

Yanıtlar:


1437

.nil? herhangi bir nesnede kullanılabilir ve nesne sıfırsa doğrudur.

.empty? dizelerde, dizilerde ve sağlamalarda kullanılabilir ve şu durumlarda true değerini döndürür:

  • Dize uzunluğu == 0
  • Dizi uzunluğu == 0
  • Karma uzunluğu == 0

.empty?Nil gibi bir şey üzerinde koşmak a NoMethodError.

İşte bu noktada devreye.blank? girer. Rails tarafından uygulanır ve herhangi bir nesne üzerinde çalışacak, ayrıca .empty?dizeler, diziler ve karmalar gibi çalışacaktır .

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

.blank? boş olmayan ancak yalnızca boşluk içeren dizelerde true değerini de değerlendirir:

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

Raylar da .present? olumsuzlamayı döndürür .blank?.

Array gotcha: bir dizinin tüm öğeleri boş olsa bile blank?dönecektir . Bu durumda boşluğu belirlemek için, örneğin ile kullanın :falseall?blank?

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

27
Soruda belirtildiği gibi, boş olmayan bazı dizeler boş olarak sayılır.
Andrew Grimm

1
Neden nil'in .empty üzerine yazmıyorlar? .blank ekleyebileceklerse?
tillda

6
Ayrıca:false.blank? == true
Shannon

2
Bahsetmeliyim presence!
Marc-André Lafortune

2
Tom'un cevabında bahsettiği tamamen boş dizi gotcha'ya ek olarak, bunun bir saldırganın params.nil olmadığı sürece kontrol eden hazırlıksız kod kullanabileceği güvenlik sorunlarına yol açabileceğini unutmayın. veya params.blank? olmadığı sürece ve şu anda Rails'te çok fazla tartışma ve çalışmanın sebebidir. Daha fazla bilgi için buraya bakın: github.com/rails/rails/issues/13420
Houen

675

Bu durumu tüm durumlar için faydalı hale getirdim:

resim açıklamasını buraya girin

blank?, present?Rails tarafından sağlanır.


57
Boş olduğu not edilmelidir? ve şimdi? sadece raylardır. Ruby 2.0.0'da Exception: NoMethodError döndürürler.
Lonny Eachus

17
any?Tabloyu güncelleyip eklemediğinizi eklemeyi düşünün .
Dennis

blank?ve present?değil "olan Raylar okunur ", otomatik olarak Rails tarafından dahil ediyoruz ama kolayca ActiveSupport Core uzantılarını kullanarak dışı Raylar kod dahil edilebilir. Bkz. Stackoverflow.com/questions/4238867/…
Tin Man

215

Sadece Julian'ın masasını uzat:

resim açıklamasını buraya girin

Ref: boş? Boş? Nil? 傻傻 分不清楚


1
@Sibevin Wang, bu tabloyu indirdim ve bazı cevaplarımda size kredi ekleyerek kullandım. Umursamıyorum umarım :) Bu büyük çaba için Kudos!
Lahiru

1
Enumerable#any?vanilya Ruby, "sadece raylar" altında listelenmemelidir
daniero

1
@daniero Hatırlatıcınız için teşekkürler, tablo güncellendi.
Sibevin Wang

Sayısal türler de vardır .zero?ve.nonzero?
DaveMongoose

63

Hızlı ipucu: !obj.blank? == obj.present?

Bazı ifadelerde gözler üzerinde kullanışlı / kolay olabilir


obj.nil'e eşdeğer bir şey var mı?
Kirk

present?active_support'nin bir parçasıdır, onu almak için neleri içereceğinizi kontrol edin: stackoverflow.com/a/4648704/1569
Factor Mystic

2
@Kirk: !! obj! Obj.nil?
Mohamed Hafez

4
@MohamedHafez Hayır değil. !!false
Ajedi32

Agh, @ Ajedi32 iyi yakala! bir istisna ile eşdeğerdir.
Mohamed Hafez

52

Bir fark, programlama dili Ruby tarafından sağlanan yöntemlerdir .nil?ve .empty?oysa web geliştirme çerçevesi Rails tarafından eklenen bir.blank? şeydir .


49

resim açıklamasını buraya girin

  • Olan herşey nil?olduğublank?
  • Olan herşey empty?olduğublank?
  • Olduğu şey empty?olduğununil?
  • Olduğu şey nil?olduğunuempty?

tl; dr - ve arasında ayrım yapmak istemiyorsanız yalnızca blank?& kullanınpresent?""" "


2
Hop! +1
Am33d

16

Boole değerinin sıfır olup olmadığını değerlendirmeye çalışırken özel bir durum söz konusudur:

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

Bu durumda tavsiye, .nil?


14

any?Öneri hakkında sadece küçük bir not : Genelde eşit olduğu konusunda haklı !empty?. Ancak, bir boşluk (ala ) dizesine any?dönecektir .true" "

Ve elbette, yukarıdaki 1.9 yoruma da bakınız.


Rails'te, yalnızca boşluk karakterleri içeren herhangi bir dize "boş": "\ n \ r \ t" .blank? # => true
Lonny Eachus

13

any?Hangisinin genellikle olduğunu unutmayın !empty?. Rails tipik olarak bir ifadenin sonunda bir şeyin varlığını kontrol ederim if somethingveya unless somethingdaha sonra blank?her yerde çalışıyor gibi göründüğü için gerekli yerlerde kullanın .


4
.hiç? herhangi bir yakut 1.9 dizeleri ile çalışmıyor, herhangi bir? numaralandırılabilir gerektirir ve # dizesi kendi başına yakut 1.9'da çalışmaz.
Andrew Grimm

4
Boşluğu any?kontrol etmeye dikkat edin. Bir dizi falsy değeriniz varsa false değerini döndürür. Bunu aşmanın bir yolu her zaman gerçek bir blok geçmek: [nil, false].any?{ true }ama !empty?daha kısadır ve garip davranışı hatırlamıyorsunuz.
Kelvin

12

nil?tüm nesnelerde çağrılabilen standart bir Ruby yöntemidir trueve nesne nil:

b = nil
b.nil? # => true

empty?Dizeler, Diziler ve Karmalar gibi bazı nesnelerde çağrılabilen ve truebu nesneler öğe içermiyorsa döndürülen standart bir Ruby yöntemidir :

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

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

empty?nilnesneler üzerinde çağrılamaz.

blank?nilboş nesnelerin yanı sıra nesnelerde de çağrılabilen bir Rails yöntemidir .


7

Herkes farkın ne olduğunu iyi açıkladı.

Ben Ruby On Rails eklemek istiyorum, kullanmak daha iyidir obj.blank?ya obj.present?yerine obj.nil?ya obj.empty?.

obj.blank?her türlü kolları nil, '', [], {}, ve iadeler truedeğerleri mevcut değilse ve iadeler falsedeğerleri nesne her türlü mevcut olup olmadığına.


5

exists?yöntem, verilerin veritabanında bulunup bulunmadığını kontrol etmek için kullanılabilir. trueVeya boole değerlerini döndürür false.


Sadece model sınıfında çalışır!
Roger

4

Raylar 4

@ corban-brook 'Array gotcha: blank?' a alternatif dizilerin yalnızca boş değerler içerip içermediğini ve boş sayılabileceğini kontrol etmek için? doğru:

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

biri de yapabilirdi:

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

3

nil?herhangi bir nesnede kullanılabilir. Nesnenin 'boş' değerler de dahil olmak üzere herhangi bir değeri olup olmadığını belirler.

Örneğin:

example = nil
example.nil?  # true

"".nil?  # false

Temel olarak nil?, sadece nesne aslında 'nil' değerine eşitse hiç geri dönmeyecektir.

empty?yalnızca koleksiyon olarak kabul edilen nesnelerde çağrılır. Bu, dizeler (karakter koleksiyonu), karmalar (anahtar / değer çiftleri koleksiyonu) ve diziler (rasgele nesneler koleksiyonu) gibi şeyleri içerir. empty?koleksiyonda öğe olmadığı için true değerini döndürür.

Örneğin:

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

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

empty?Nil nesneleri olarak adlandırılamadığına dikkat edin , nil nesneleri bir koleksiyon değildir ve bir istisna oluşturur.

Ayrıca, koleksiyondaki öğeler boş olsa bile, koleksiyonun boş olduğu anlamına gelmez.

blank?temelde bir kombinasyonudur nil?ve empty?koleksiyonlar olduğunu varsaydığınız nesneleri kontrol etmek için yararlıdır, ancak sıfır da olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.