Apa bedanya? Kapan saya harus menggunakan yang mana? Mengapa mereka begitu banyak?
ruby
inheritance
introspection
Claudiu
sumber
sumber
is_a?
dankind_of?
ada: Saya kira itu bagian dari filosofi desain Ruby. Python akan mengatakan bahwa seharusnya hanya ada satu cara untuk melakukan sesuatu; Ruby sering memiliki metode sinonim sehingga Anda dapat menggunakan salah satu yang terdengar lebih baik. Ini masalah preferensi. Ini mungkin sebagian karena pengaruh Jepang: Saya diberitahu bahwa mereka akan menggunakan kata yang berbeda untuk nomor yang sama tergantung pada kalimat untuk membuatnya terdengar lebih baik. Matz mungkin telah membawa gagasan itu ke dalam desain bahasanya.Jawaban:
kind_of?
danis_a?
identik.instance_of?
berbeda dari dua lainnya karena hanya mengembalikantrue
jika objek adalah turunan dari kelas yang tepat, bukan subkelas.Contoh:
"hello".is_a? Object
dan"hello".kind_of? Object
kembalitrue
karena"hello"
aString
danString
merupakan subclass dariObject
."hello".instance_of? Object
kembalifalse
.sumber
@honda.kind_of? Car
dan@person.is_a? Administrator
, semua Ruby tentang estetika. Faktanya, perhatikan kesalahan tata bahasa ... dengan dukungan aktif yang dapat Anda tulis:)@person.is_an? Administrator
... Itu mungkin sudah menjadi inti Ruby sekarang.kind_of?
tetapi tidakis_a?
?is_an?
tidak di ruby-1.9.2-p0. @Cudiudiu, tidak.is_a?
hanyalah alias darikind_of?
. Kedua metode memanggil fungsi c yang samarb_obj_is_kind_of
,.kind_of?
tanpa mengesampingkanis_a?
.is_an?
metode ActiceSupport ini ?! Itu tidak dalam versi rel saat ini, dan saya tidak dapat menemukan apa pun di google tentang hal itu menjadi usang juga.Dari dokumentasi:
dan:
Jika tidak jelas, alangkah baiknya jika mengetahui apa yang sebenarnya tidak jelas, sehingga dokumentasi dapat ditingkatkan.
Tidak pernah. Gunakan polimorfisme sebagai gantinya.
Saya tidak akan menyebut dua "banyak". Ada dua di antara mereka, karena mereka melakukan dua hal yang berbeda.
sumber
Lebih seperti Ruby untuk bertanya objek apakah mereka menanggapi metode yang Anda butuhkan atau tidak, gunakan
respond_to?
. Ini memungkinkan antarmuka minimal dan implementasi pemrograman yang tidak disadari.Tentu saja hal ini tidak selalu berlaku, sehingga masih ada kemungkinan untuk bertanya tentang pemahaman "tipe" yang lebih konservatif, yaitu kelas atau kelas dasar, menggunakan metode yang Anda tanyakan.
sumber
Saya juga tidak akan memanggil dua banyak (
is_a?
dankind_of?
alias dari metode yang sama), tetapi jika Anda ingin melihat lebih banyak kemungkinan, alihkan perhatian Anda ke#class
metode:sumber