Apa bedanya? Kapan saya harus menggunakan yang mana? Mengapa mereka begitu banyak?
Apa bedanya? Kapan saya harus menggunakan yang mana? Mengapa mereka begitu banyak?
Jawaban:
kind_of?
dan is_a?
identik.
instance_of?
berbeda dari dua lainnya karena hanya mengembalikan true
jika objek adalah turunan dari kelas yang tepat, bukan subkelas.
Contoh:
"hello".is_a? Object
dan "hello".kind_of? Object
kembali true
karena "hello"
a String
dan String
merupakan subclass dari Object
."hello".instance_of? Object
kembali false
.@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 tidak is_a?
?
is_an?
tidak di ruby-1.9.2-p0. @Cudiudiu, tidak. is_a?
hanyalah alias darikind_of?
. Kedua metode memanggil fungsi c yang sama rb_obj_is_kind_of
,.
kind_of?
tanpa mengesampingkan is_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.
Apa bedanya?
Dari dokumentasi:
- - ( Boolean )
instance_of?(class)
- Mengembalikan
true
jikaobj
adalah turunan dari kelas yang diberikan.
dan:
- - ( Boolean )
is_a?(class)
- ( Boolean )kind_of?(class)
- Mengembalikan
true
jikaclass
adalah kelasobj
, atau jikaclass
adalah salah satu dari superclassesobj
atau modul yang disertakanobj
.
Jika tidak jelas, alangkah baiknya jika mengetahui apa yang sebenarnya tidak jelas, sehingga dokumentasi dapat ditingkatkan.
Kapan saya harus menggunakan yang mana?
Tidak pernah. Gunakan polimorfisme sebagai gantinya.
Mengapa mereka begitu banyak?
Saya tidak akan menyebut dua "banyak". Ada dua di antara mereka, karena mereka melakukan dua hal yang berbeda.
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.
Saya juga tidak akan memanggil dua banyak ( is_a?
dan kind_of?
alias dari metode yang sama), tetapi jika Anda ingin melihat lebih banyak kemungkinan, alihkan perhatian Anda ke #class
metode:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
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.