Apakah ada yang lebih idiomatis dari yang berikut ini?
foo.class == String
Apakah ada yang lebih idiomatis dari yang berikut ini?
foo.class == String
Jawaban:
Saya pikir Anda sedang mencari instance_of?
. is_a?
dan kind_of?
akan mengembalikan true untuk instance dari kelas turunan.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
String
, tetapi juga dengan Integer
dan Float
. Apakah itu juga berhasil Decimal
? (penerjemah teks luhur menyoroti sintaks berbeda Decimal
yang membuat saya curiga)
Pendekatan yang lebih mengetik bebek bisa dikatakan
foo.respond_to?(:to_str)
to_str
menunjukkan bahwa kelas objek mungkin bukan turunan sebenarnya dari String, tetapi objek itu sendiri sangat mirip string (stringy?).
foo
baik akan true
, false
atau vanili string, tapi baik itu untuk belajar solusi yang lebih umum.
to_str
, atau to_s
? Keduanya sedikit berbeda.
Anda dapat melakukan:
foo.instance_of?(String)
Dan yang lebih umum:
foo.kind_of?(String)
kind_of
lebih umum? Mereka tampaknya identik: is_a
.
instance_of?
bukan is_a?
.
Selain jawaban lainnya, Kelas mendefinisikan metode === untuk menguji apakah suatu objek adalah turunan dari kelas itu.
Menurut saya cara yang lebih baik adalah dengan membuat beberapa metode predikat. Ini juga akan menyimpan "Titik Kontrol Tunggal" Anda.
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
Cara mengetik lebih bebek;)
"string".is_a?(String)
. Sepertinya Anda menciptakan kembali kemudi. Ada juga class
, instance_of
, kind_of
, dll ... Bad ide untuk monyet patch Object
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.
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_principle