Yang penting untuk dipahami adalah bahwa tidak ada yang namanya metode kelas di Ruby.
Metode kelas sebenarnya hanya metode tunggal. Tidak ada yang istimewa tentang metode kelas. Setiap objek dapat memiliki metode tunggal. Kita menyebutnya "metode kelas" ketika objeknya adalah Class
karena "metode singleton dari instance Class
" terlalu panjang dan sulit digunakan.
Tunggu! Apakah saya mengatakan "metode tunggal"?
Hal lain yang penting untuk dipahami adalah bahwa tidak ada yang namanya metode singleton di Ruby.
Metode singleton sebenarnya hanya metode instance lama yang membosankan dari kelas singleton. Tidak ada yang istimewa tentang metode singleton. Mereka hanya metode contoh seperti metode contoh lainnya.
Faktanya, Ruby hanya memiliki metode instance. Tidak ada fungsi, tidak ada konstruktor, tidak ada metode statis, tidak ada metode kelas, tidak ada fungsi modul, tidak ada metode tunggal.
Pertanyaannya bukan "apakah ini metode kelas, apakah ini metode tunggal", melainkan " modul apa yang dimaksud dengan metode ini?"
"Metode Singleton" adalah metode instan yang didefinisikan dalam kelas singleton. Sintaks untuk mengakses kelas singleton foo
adalah
class << foo
end
Ada juga metode Object#singleton_class
yang mengembalikan kelas singleton objek.
Mengapa saya begitu agresif memalu tentang fakta bahwa setiap metode adalah metode contoh dan metode kelas tidak ada? Karena itu berarti model objek Ruby jauh lebih sederhana daripada yang dipikirkan orang! Setelah semua, dalam pertanyaan Anda, Anda sudah menunjukkan bahwa Anda tahu cara alias metode contoh, tetapi Anda mengatakan bahwa Anda tidak tahu cara alias metode kelas. Tapi itu salah! Anda lakukan tahu bagaimana metode kelas alias, karena mereka metode instan hanya . Jika Anda telah diajarkan fakta ini dengan benar, Anda tidak akan pernah perlu mengajukan pertanyaan ini!
Setelah Anda memahami bahwa setiap metode adalah metode instan, dan apa yang kami sebut "metode singleton" hanyalah metode instan dari kelas singleton, solusinya menjadi jelas:
singleton_class.alias_method :a_new_class_method, :a_class_method
Catatan: ketika saya menulis di atas bahwa "tidak ada yang namanya X", yang saya maksudkan adalah "tidak ada yang namanya X dalam bahasa Ruby ". Itu tidak berarti bahwa konsep-konsep itu tidak ada di komunitas Ruby .
Kita secara teratur berbicara tentang "metode singleton" dan "metode kelas", hanya karena lebih mudah daripada berbicara tentang "metode instan dari kelas singleton" atau "metode instan dari kelas singleton suatu objek yang kebetulan merupakan instance dari Class
kelas tersebut ". Ada metode bahkan seperti Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, dan Module#module_function
di perpustakaan inti Ruby. Tetapi selalu penting untuk diingat bahwa itu bukan konsep bahasa. Itu adalah konsep komunitas yang hanya ada di kepala kita dan atas nama beberapa metode perpustakaan.
extend ClassMethods
solusinya. +1