Untuk memeriksa apa @some_var
, saya melakukan a
if @some_var.class.to_s == 'Hash'
Saya yakin ada cara yang lebih elegan untuk memeriksa apakah @some_var
itu a Hash
atau Array
.
Untuk memeriksa apa @some_var
, saya melakukan a
if @some_var.class.to_s == 'Hash'
Saya yakin ada cara yang lebih elegan untuk memeriksa apakah @some_var
itu a Hash
atau Array
.
[result_hash, another_result_hash]
atau single_result_hash
? Siapa pun yang membuat API itu tidak melakukan pekerjaan dengan baik!
Jawaban:
Anda bisa melakukan:
@some_var.class == Hash
atau juga sesuatu seperti:
@some_var.is_a?(Hash)
Perlu dicatat bahwa "is_a?" metode ini benar jika kelas berada di mana saja di pohon leluhur objek. contohnya:
@some_var.is_a?(Object) # => true
hal di atas benar jika @some_var adalah turunan dari hash atau kelas lain yang berasal dari Object. Jadi, jika Anda ingin pencocokan ketat pada jenis kelas, gunakan == atau instance_of? Metode mungkin adalah apa yang Anda cari.
is_a?
adalah pilihan terbaik, karena ia juga mengembalikan true
subclass.
@som_var.is_a? Hash
bekerja juga :)
ActiveSupport::HashWithIndifferentAccess
mewarisi dari Hash, karenanya @some_var.is_a?(Hash)
akan mengembalikan true dalam kasus ini juga. (Saya baru saja memiliki pertanyaan yang sama dan kasus HashWithIndifferentAccess dan agak bingung dengan komentar Anda ... jadi saya ingin mengklarifikasi)
Pertama-tama, jawaban terbaik untuk pertanyaan literal adalah
Hash === @some_var
Tetapi pertanyaan itu seharusnya dijawab dengan menunjukkan bagaimana melakukan bebek-mengetik di sini. Itu tergantung sedikit pada jenis bebek yang Anda butuhkan.
@some_var.respond_to?(:each_pair)
atau
@some_var.respond_to?(:has_key?)
atau bahkan
@some_var.respond_to?(:to_hash)
mungkin benar tergantung aplikasinya.
Biasanya di ruby ketika Anda mencari "tipe" Anda sebenarnya menginginkan "tipe bebek" atau "apakah dukun seperti bebek?". Anda akan melihat apakah itu menanggapi metode tertentu:
@some_var.respond_to?(:each)
Anda dapat mengulangi @some_var karena merespons: masing-masing
Jika Anda benar-benar ingin mengetahui jenisnya dan jika itu adalah Hash atau Array maka Anda dapat melakukan:
["Hash", "Array"].include?(@some_var.class) #=> check both through instance class
@some_var.kind_of?(Hash) #=> to check each at once
@some_var.is_a?(Array) #=> same as kind_of
sort
dulu.
["Hash", "Array"].include?(@some_var.class.to_s) #=> check both through instance class
Dalam praktiknya, Anda akan sering ingin bertindak berbeda tergantung pada apakah variabel itu Array atau Hash, bukan hanya sekadar memberi tahu. Dalam situasi ini, idiom elegan adalah sebagai berikut:
case item
when Array
#do something
when Hash
#do something else
end
Perhatikan bahwa Anda tidak mengaktifkan .class
metode ini item
.
Kamu bisa memakai instance_of?
misalnya
@some_var.instance_of?(Hash)
ActiveRecord::Collection
dan mencoba instance_of?(Array)
maka ini akan kembali false
, sedangkan is_a?(Array)
akan kembali true
.
Jika Anda ingin menguji apakah suatu objek secara ketat atau meluas Hash
, gunakan:
value = {}
value.is_a?(Hash) || value.is_a?(Array) #=> true
Tetapi untuk membuat nilai dari mengetik bebek Ruby, Anda bisa melakukan sesuatu seperti:
value = {}
value.respond_to?(:[]) #=> true
Ini berguna ketika Anda hanya ingin mengakses beberapa nilai menggunakan value[:key]
sintaks.
Harap dicatat bahwa
Array.new["key"]
akan memunculkan aTypeError
.