Apakah ada yang lebih idiomatis dari yang berikut ini?
foo.class == String
ruby
idioms
typechecking
davidchambers.dll
sumber
sumber
is_a?
sebenarnya adalah idiom yang lebih tepat untuk digunakan (dan seringkali cek mengetik bebek seperti yang disebutkan Andrew Grimm bahkan lebih baik). Perbandingan kelas yang ketat biasanya merupakan bau kode. en.wikipedia.org/wiki/Liskov_substitution_principleString
, tetapi juga denganInteger
danFloat
. Apakah itu juga berhasilDecimal
? (penerjemah teks luhur menyoroti sintaks berbedaDecimal
yang membuat saya curiga)Pendekatan yang lebih mengetik bebek bisa dikatakan
to_str
menunjukkan bahwa kelas objek mungkin bukan turunan sebenarnya dari String, tetapi objek itu sendiri sangat mirip string (stringy?).sumber
foo
baik akantrue
,false
atau vanili string, tapi baik itu untuk belajar solusi yang lebih umum.to_str
, atauto_s
? Keduanya sedikit berbeda.Anda dapat melakukan:
Dan yang lebih umum:
sumber
kind_of
lebih umum? Mereka tampaknya identik:is_a
.instance_of?
bukanis_a?
.atau
jika Anda Anda hanya peduli jika itu diturunkan dari
String
suatu tempat ke atas rantai warisannyasumber
Selain jawaban lainnya, Kelas mendefinisikan metode === untuk menguji apakah suatu objek adalah turunan dari kelas itu.
sumber
Menurut saya cara yang lebih baik adalah dengan membuat beberapa metode predikat. Ini juga akan menyimpan "Titik Kontrol Tunggal" Anda.
Cara mengetik lebih bebek;)
sumber
"string".is_a?(String)
. Sepertinya Anda menciptakan kembali kemudi. Ada jugaclass
,instance_of
,kind_of
, dll ... Bad ide untuk monyet patchObject
kelas, belum lagi itu perlu.pre_check("test".is_string?)
Sekarang kebutuhan proyek Anda akan berubah dan setiap String dengan tiga karakter atau lebih tidak lagi didefinisikan sebagai String (saya tahu ini tidak biasa;)) Sekarang Anda dapat mengubah metode Anda sendiri dengan mudah.