Saya menemukan diri saya berulang kali mencari definisi yang jelas tentang perbedaan nil?
, blank?
dan empty?
di Ruby on Rails. Inilah yang paling dekat dengan saya:
blank?
objek adalah string palsu, kosong, atau spasi. Sebagai contoh,""
," "
,nil
,[]
, dan{}
kosong.nil?
objek adalah instance dari NilClass.empty?
objek adalah kelas-spesifik, dan definisi bervariasi dari kelas ke kelas. String kosong jika tidak memiliki karakter, dan array kosong jika tidak mengandung item.
Apakah ada yang hilang, atau perbandingan yang lebih ketat yang bisa dibuat?
ruby-on-rails
ruby
Arrel
sumber
sumber
present?
. Yang karenablank?
mengembalikan true untuk array kosong.:nil?
didefinisikan pada::Kernel
dan diganti pada::NilClass
, sementara:empty?
diimplementasikan secara terpisah di banyak kelas (native pada::String
,::Array
,::Hash
, dan non-native di kelas-kelas lain seperti::Set
dari stdlib dan::ActiveRecord::Relation
dari rel). Jadi:nil?
tersedia di semua subclass::Object
dan juga di setiap kelas yang termasuk::Kernel
dengan sendirinya, di mana:empty?
harus diterapkan atau dimasukkan secara khusus di kelas Anda.nil
konsep, mulailah dari sini .[1] pry(main)> [].blank? => true
Jawaban:
.nil?
dapat digunakan pada objek apa pun dan benar jika objek tersebut nihil..empty?
dapat digunakan pada string, array dan hash dan mengembalikan true jika:Menjalankan
.empty?
sesuatu yang nihil akan melemparNoMethodError
.Di situlah
.blank?
masuk. Ini diterapkan oleh Rails dan akan beroperasi pada objek apa pun serta bekerja seperti.empty?
pada string, array dan hash..blank?
juga mengevaluasi true pada string yang tidak kosong tetapi hanya berisi spasi putih:Rails juga menyediakan
.present?
, yang mengembalikan negasi.blank?
.Array Gotcha:
blank?
akan kembalifalse
bahkan jika semua elemen array kosong. Untuk menentukan kekosongan dalam hal ini, gunakanall?
denganblank?
, misalnya:sumber
false.blank? == true
presence
!Saya membuat tabel yang berguna ini dengan semua kasus:
blank?
,present?
disediakan oleh Rails.sumber
any?
jika Anda pernah memperbarui tabel.blank?
danpresent?
bukan " Rails-only ", mereka secara otomatis disertakan oleh Rails tetapi dapat dengan mudah dimasukkan dalam kode non-Rails dengan menggunakan ekstensi Core ActiveSupport. Lihat stackoverflow.com/questions/4238867/…Cukup rentangkan meja Julian:
Ref: kosong? Kosong? Kosong? 傻傻 分不清楚
sumber
Enumerable#any?
adalah vanilla Ruby, tidak boleh terdaftar di bawah "rails only".zero?
dan.nonzero?
Kiat cepat:
!obj.blank? == obj.present?
Dapat berguna / lebih mudah di mata dalam beberapa ekspresi
sumber
present?
adalah bagian dari active_support, periksa di sini tentang apa yang harus disertakan untuk mendapatkannya: stackoverflow.com/a/4648704/1569!!false
Salah satu perbedaan adalah bahwa
.nil?
dan.empty?
adalah metode yang disediakan oleh bahasa pemrograman Ruby, sedangkan.blank?
sesuatu ditambahkan oleh kerangka pengembangan web Rails.sumber
nil?
adablank?
empty?
adablank?
empty?
adalahnil?
nil?
adalahempty?
tl; dr - hanya gunakan
blank?
&present?
kecuali Anda ingin membedakan antara""
dan" "
sumber
Kasus khusus adalah ketika mencoba menilai apakah nilai boolean nol:
Dalam hal ini rekomendasi akan digunakan
.nil?
sumber
Hanya sedikit catatan tentang
any?
rekomendasi: Dia benar bahwa itu umumnya setara dengan!empty?
. Namun,any?
akan kembalitrue
ke string hanya spasi putih (ala" "
).Dan tentu saja, lihat 1.9 komentar di atas juga.
sumber
Jangan lupa
any?
yang umumnya!empty?
. Di Rails saya biasanya memeriksa keberadaan sesuatu di akhir pernyataan denganif something
atauunless something
menggunakan diblank?
mana diperlukan karena tampaknya berfungsi di mana-mana.sumber
any?
dalam memeriksa ketidak-kekosongan. Ini mengembalikan false jika Anda memiliki array nilai-nilai palsu. Cara untuk menyiasatinya adalah dengan melewati blok yang selalu benar:,[nil, false].any?{ true }
tetapi!empty?
lebih pendek dan Anda tidak ingat perilaku anehnya.nil?
adalah metode standar Ruby yang dapat dipanggil pada semua objek dan kembalitrue
jika objeknya adalahnil
:empty?
adalah metode standar Ruby yang dapat dipanggil pada beberapa objek seperti Strings, Array dan Hash dan kembalitrue
jika objek ini tidak mengandung elemen:empty?
tidak bisa dipanggil padanil
objek.blank?
adalah metode Rails yang dapat dipanggil padanil
objek maupun objek kosong.sumber
Semua orang telah menjelaskan dengan baik apa bedanya.
Saya ingin menambahkan di Ruby On Rails, lebih baik menggunakan
obj.blank?
atauobj.present?
daripadaobj.nil?
atauobj.empty?
.obj.blank?
menangani semua jenisnil
,''
,[]
,{}
, dan kembalitrue
jika nilai-nilai tidak tersedia dan kembalifalse
jika nilai-nilai yang tersedia pada setiap jenis objek.sumber
exists?
Metode dapat digunakan untuk memeriksa apakah data ada dalam database atau tidak. Ini mengembalikan nilai boolean baiktrue
ataufalse
.sumber
Rel 4
alternatif untuk @ corban-brook 'Array gotcha: blank?' untuk memeriksa apakah array hanya memiliki nilai kosong dan dapat dianggap kosong? benar:
seseorang juga bisa melakukannya:
sumber
nil?
dapat digunakan pada objek apa saja. Ini menentukan apakah objek memiliki nilai atau tidak, termasuk nilai 'kosong'.Sebagai contoh:
Pada dasarnya
nil?
hanya akan pernah mengembalikan true jika objek tersebut sebenarnya sama dengan 'nil'.empty?
hanya dipanggil pada objek yang dianggap koleksi. Ini termasuk hal-hal seperti string (kumpulan karakter), hash (kumpulan pasangan kunci / nilai) dan array (kumpulan objek yang berubah-ubah).empty?
Mengembalikan nilai true adalah tidak ada item dalam koleksi.Sebagai contoh:
Perhatikan bahwa
empty?
tidak dapat dipanggil pada objek nil karena objek nil bukan koleksi dan itu akan menimbulkan pengecualian.Juga perhatikan bahwa meskipun item dalam koleksi kosong, itu tidak berarti koleksi kosong.
blank?
pada dasarnya adalah kombinasi darinil?
danempty?
Ini berguna untuk memeriksa objek yang Anda anggap koleksi, tetapi bisa juga nol.sumber