Saya akan menggunakan python sebagai contoh dari apa yang saya cari (Anda bisa menganggapnya sebagai pseudocode jika Anda tidak tahu Python):
>>> a = 1
>>> type(a)
<type 'int'>
Saya tahu di ruby saya bisa melakukan:
1.9.3p194 :002 > 1.class
=> Fixnum
Tetapi apakah ini cara yang tepat untuk menentukan jenis objek?
isinstance
atau memeriksa tanggapan. Tetapi hanya mengatakan "NOES !!!" tidak benar-benar membantu, kan? Alih-alih mempertimbangkan untuk mendidik.Jawaban:
Cara yang tepat untuk menentukan "jenis" objek, yang merupakan istilah goyah di dunia Ruby, adalah dengan menelepon
object.class
.Karena kelas dapat mewarisi dari kelas lain, jika Anda ingin menentukan apakah suatu objek adalah "dari jenis tertentu" Anda mungkin memanggil
object.is_a?(ClassName)
untuk melihat apakahobject
adalah tipeClassName
atau berasal dari itu.Biasanya pengecekan tipe tidak dilakukan di Ruby, tetapi sebaliknya objek dinilai berdasarkan kemampuan mereka untuk merespons metode tertentu, yang biasa disebut " Duck typing ". Dengan kata lain, jika itu menanggapi metode yang Anda inginkan, tidak ada alasan untuk menjadi khusus tentang jenisnya.
Sebagai contoh,
object.is_a?(String)
terlalu kaku karena kelas lain mungkin mengimplementasikan metode yang mengubahnya menjadi string, atau membuatnya berperilaku identik dengan bagaimana perilaku String.object.respond_to?(:to_s)
akan menjadi cara yang lebih baik untuk menguji bahwa objek tersebut melakukan apa yang Anda inginkan.sumber
#class
tidak tidak kembali jenis objek, ia mengembalikan nya kelas . Nama itu seharusnya merupakan hadiah mati. Kelas dan Jenis adalah dua benar-benar konsep yang berbeda di OO.typeof
dari C, JavaScript dan lainnyaclass
. Tidak ada sistem protokol formal di Ruby seperti di bahasa lain, Objective-C menjadi relatif Smalltalk terdekat dengan itu. Jika Anda mendefinisikan "ketik" sebagai "objek yang merespons serangkaian metode tertentu dengan hasil yang dapat diterima" maka benar-benar tidak ada cara untuk menyatakan itu. Terlalu longgar. Sebagian besar waktu di Ruby ketika merujuk ke jenis objek, dipahami Anda berbicara tentang kelas. Saya memang menggunakan istilah ketik dalam tanda kutip karena alasan itu.int i
" atau "Integer j
".) Tadman menjawab pertanyaan dengan cara yang tampaknya memenuhi kedua penanya dan khalayak umum, sambil menjelaskan terminologi yang digunakan Ruby. Saya tidak tertarik untuk masuk ke akademik rambut yang terpecah-pecah atas poin-poin penting dari terminologi berorientasi objek, jadi tolong sampaikan kata terakhirnya.Anda juga dapat mencoba:
instance_of?
sumber
Seringkali di Ruby, Anda sebenarnya tidak peduli apa kelas objeknya, karena Anda hanya peduli bahwa itu merespons metode tertentu. Ini dikenal sebagai Duck Typing dan Anda akan melihatnya di semua jenis basis kode Ruby.
Jadi dalam banyak (jika tidak sebagian besar) kasus, yang terbaik untuk menggunakan Mengetik Bebek menggunakan
#respond_to?(method)
:sumber
Saya akan mengatakan "Ya". Seperti "Matz" telah mengatakan sesuatu seperti ini dalam salah satu ceramahnya, "Benda Ruby tidak memiliki tipe." Tidak semuanya tetapi bagian yang ia coba sampaikan kepada kami. Mengapa ada orang yang mengatakan "Semuanya adalah Obyek"? Untuk menambahkan dia berkata "Data memiliki Jenis bukan objek".
Jadi kita bisa menikmati ini.
https://www.youtube.com/watch?v=1l3U1X3z0CE
Tapi Ruby tidak terlalu peduli tentang jenis objek hanya kelasnya. Kami menggunakan kelas bukan tipe. Semua data kemudian memiliki kelas.
Mereka mungkin juga memiliki leluhur
Mereka juga memiliki kelas meta tetapi saya akan menghemat detail tentang hal itu.
Setelah Anda mengetahui kelasnya maka Anda akan dapat mencari metode apa yang dapat Anda gunakan untuk itu. Di situlah "tipe data" diperlukan. Jika Anda benar-benar ingin masuk ke detail ...
"The Ruby Object Model"
Ini adalah istilah yang digunakan untuk bagaimana Ruby menangani objek. Semuanya internal sehingga Anda tidak benar-benar melihat banyak dari ini, tetapi senang mengetahui. Tapi itu topik lain.
Iya! Kelas adalah tipe data. Objek memiliki kelas dan data memiliki tipe. Jadi jika Anda tahu tentang basis data maka Anda tahu hanya ada satu set tipe yang terbatas.
teks memblokir angka
sumber
Object.ancestors # => [Object, Kernel, BasicObject]