Apa yang class << self
dilakukan di Ruby ?
ruby
metaclass
eigenclass
singleton
Randand
sumber
sumber
Jawaban:
Pertama,
class << foo
sintaks membukafoo
kelas singleton (eigenclass). Ini memungkinkan Anda untuk mengkhususkan perilaku metode yang dipanggil pada objek tertentu.Sekarang, untuk menjawab pertanyaan:
class << self
membukaself
kelas singleton, sehingga metode dapat didefinisikan ulang untukself
objek saat ini (yang di dalam kelas atau badan modul adalah kelas atau modul itu sendiri ). Biasanya, ini digunakan untuk mendefinisikan metode kelas / modul ("statis"):Ini juga dapat ditulis sebagai steno:
Atau bahkan lebih pendek:
Ketika di dalam definisi fungsi,
self
merujuk ke objek yang dipanggil fungsi. Dalam hal ini,class << self
buka kelas tunggal untuk objek itu; satu kegunaannya adalah untuk mengimplementasikan mesin negara orang miskin:Jadi, dalam contoh di atas, setiap contoh
StateMachineExample
telahprocess_hook
alias untukprocess_state_1
, namun catatan bagaimana di kedua, dapat mendefinisikan kembaliprocess_hook
(untukself
saja, yang tidak mempengaruhi lainnyaStateMachineExample
contoh) untukprocess_state_2
. Jadi, setiap kali penelepon memanggilprocess
metode (yang memanggil didefinisikan ulangprocess_hook
), perilaku berubah tergantung pada keadaan apa itu.sumber
class << self
, untuk membuat metode kelas / modul. Saya mungkin akan memperluas penggunaan ituclass << self
, karena itu adalah penggunaan yang jauh lebih idiomatis.a
'ssingleton_class
karenaa
' kelas s (setelah mengubahinspect
) adalah varian unik dariString
kelas. Jika itu mengubahString
kelas singleton itu akan mempengaruhi semuaString
contoh lainnya . Yang lebih aneh lagi adalah bahwa jika nanti Anda membuka kembaliString
untuk mendefinisikan ulanginspect
makaa
akan tetap mengambil perubahan baru.class << self
artinya lebih dari nilaiself
yang diset sama dengan kelas singleton dalam ruang lingkup blok?Saya menemukan penjelasan super sederhana tentang
class << self
,Eigenclass
dan berbagai jenis metode.Di Ruby, ada tiga jenis metode yang dapat diterapkan ke kelas:
Metode instance dan metode kelas hampir mirip dengan homonim mereka dalam bahasa pemrograman lain.
Cara lain untuk mengakses
Eigenclass
(yang mencakup metode tunggal) adalah dengan sintaks berikut (class <<
):sekarang Anda dapat mendefinisikan metode singleton
self
yang merupakan kelasFoo
itu sendiri dalam konteks ini:sumber
foo.singleton_class.instance_methods(false)
untuk memeriksa.Biasanya, metode instan adalah metode global. Itu berarti mereka tersedia dalam semua instance kelas di mana mereka didefinisikan. Sebaliknya, metode singleton diterapkan pada satu objek.
Ruby menyimpan metode dalam kelas dan semua metode harus dikaitkan dengan suatu kelas. Objek di mana metode singleton didefinisikan bukan kelas (itu adalah instance dari kelas). Jika hanya kelas yang dapat menyimpan metode, bagaimana suatu objek dapat menyimpan metode tunggal? Ketika metode singleton dibuat, Ruby secara otomatis membuat kelas anonim untuk menyimpan metode itu. Kelas anonim ini disebut metaclasses, juga dikenal sebagai kelas singleton atau eigenclasses. Metode singleton dikaitkan dengan metaclass yang, pada gilirannya, dikaitkan dengan objek di mana metode singleton didefinisikan.
Jika beberapa metode tunggal didefinisikan dalam satu objek, mereka semua disimpan dalam metaclass yang sama.
Dalam contoh di atas, kelas << z1 mengubah diri saat ini untuk menunjuk ke metaclass dari objek z1; kemudian, ia mendefinisikan metode say_hello dalam metaclass.
Kelas juga objek (turunan dari kelas yang disebut Kelas). Metode kelas tidak lebih dari metode tunggal yang terkait dengan objek kelas.
Semua objek mungkin memiliki metaclasses. Itu berarti kelas juga dapat memiliki metaclasses. Dalam contoh di atas, kelas << self memodifikasi diri sehingga menunjuk ke metaclass dari kelas Zabuton. Ketika suatu metode didefinisikan tanpa penerima yang eksplisit (kelas / objek tempat metode tersebut akan didefinisikan), itu didefinisikan secara implisit dalam lingkup saat ini, yaitu, nilai saat ini dari diri. Oleh karena itu, metode barang didefinisikan dalam metaclass dari kelas Zabuton. Contoh di atas hanyalah cara lain untuk mendefinisikan metode kelas. IMHO, lebih baik menggunakan sintaks def self.my_new_clas_method untuk mendefinisikan metode kelas, karena itu membuat kode lebih mudah dimengerti. Contoh di atas disertakan sehingga kami memahami apa yang terjadi ketika kami menjumpai kelas << sintaks diri.
Info tambahan dapat ditemukan di posting ini tentang Ruby Classes .
sumber
Kelas apa << yang dikerjakan:
[itu dibuat
self == thing.singleton_class
dalam konteks bloknya] .Apa itu thing.singleton_class?
hi
objek mewarisi#methods
dari#singleton_class.instance_methods
dan kemudian dari#class.instance_methods
.Di sini kita memberikan
hi
's kelas tunggal metode contoh:a
. Itu bisa dilakukan dengan kelas << hai sebagai gantinya.hi
Ini#singleton_class
semua contoh metodehi
's#class
memiliki, dan mungkin lagi (:a
di sini).[contoh metode hal
#class
dan#singleton_class
dapat diterapkan langsung ke hal ketika ruby melihat thing.a, ia pertama-tama mencari: definisi metode di thing.singleton_class.instance_methods dan kemudian di thing.class.instance_methods]By the way - mereka memanggil kelas singleton objek == metaclass == eigenclass .
sumber
А metode tunggal adalah metode yang didefinisikan hanya untuk satu objek.
Contoh:
Metode Singleton untuk SomeClass
uji
Metode Singleton tentang test_obj
test_2
test_3
sumber
Bahkan jika Anda menulis ekstensi C untuk proyek Ruby Anda, hanya ada satu cara untuk mendefinisikan metode Modul.
Saya tahu bisnis mandiri ini hanya membuka semua jenis pertanyaan lain sehingga Anda bisa melakukan yang lebih baik dengan mencari di setiap bagian.
Objek dulu.
Bisakah saya membuat metode untuk foo?
Tentu
Apa yang harus saya lakukan dengannya?
Hanya objek lain.
Anda mendapatkan semua metode Objek plus yang baru.
Hanya Obyek foo.
Cobalah untuk melihat apa yang terjadi jika Anda membuat foo dari Objek lain seperti Kelas dan Modul. Contoh-contoh dari semua jawaban bagus untuk dimainkan, tetapi Anda harus bekerja dengan ide atau konsep yang berbeda untuk benar-benar memahami apa yang terjadi dengan cara kode ditulis. Jadi sekarang Anda memiliki banyak persyaratan untuk dilihat.
Singleton, Class, Module, self, Object, dan Eigenclass dibesarkan tetapi Ruby tidak menyebut Model Object seperti itu. Ini lebih seperti Metaclass. Richard atau __why menunjukkan Anda ide di sini. http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html Dan jika pukulan Anda pergi maka cobalah mencari Model Obyek Ruby dalam pencarian. Dua video yang saya tahu di YouTube adalah Dave Thomas dan Peter Cooper. Mereka mencoba menjelaskan konsep itu juga. Butuh waktu lama untuk mendapatkannya, jadi jangan khawatir. Saya masih mengerjakannya juga. Kenapa lagi saya di sini? Terima kasih atas pertanyaan anda Lihat juga perpustakaan standar. Ini memiliki Modul Singleton seperti halnya FYI.
Ini cukup bagus. https://www.youtube.com/watch?v=i4uiyWA8eFk
sumber