Pertimbangkan kelas berikut:
class Foo
def an_inst_method
'instance method'
end
def self.a_class_method
'class method'
end
alias_method :a_new_inst_method, :an_inst_method
end
Ini bukan masalah dan Anda dapat menelepon Foo.new.a_new_inst_method
tanpa masalah.
Saya ingin kemampuan untuk memiliki metode kelas seperti Foo.add_widget(*items)
dan alias sehingga saya dapat melakukan sesuatu seperti:
Foo.add_widget 'item1'
Foo.add_widgets 'item2', 'item3'
Jadi pada dasarnya ia memiliki "gaya ruby" seperti 1.minute
dan 2.minutes
jadi saya ingin alias Foo.add_widget
panggilan begitu Foo.add_widgets
metode yang sama persis. Saya tahu saya bisa membungkusnya tetapi saya merasa saya harus bisa melakukan ini dengan cara yang lebih bersih.
Pertimbangkan upaya saya untuk mencoba sesuatu seperti ini:
class Foo
def an_inst_method
'instance method'
end
def self.a_class_method
'class method'
end
alias_method :a_new_inst_method, :an_inst_method
alias_method :a_new_class_method, :a_class_method
end
Namun, saya mendapatkan kesalahan berikut:
NameError (undefined method `a_class_method' for class `Foo')
Dan sepertinya ini tidak bekerja untuk metode kelas. Bagaimana cara saya melakukan ini?
sumber
extend ClassMethods
solusinya. +1Yang 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 instanceClass
" 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
adalahAda 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:
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 sepertiObject#define_singleton_method
,Object#singleton_method
,Object#singleton_methods
,Module#private_class_method
,Module#public_class_method
, danModule#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.sumber
OK, sepertinya saya bisa melakukan sesuatu seperti ini dan itu akan berhasil:
Jika ada yang punya informasi berguna tentang bahasa Ruby di sini dan ingin mengirim jawaban yang komprehensif, saya akan memberi Anda +1.
sumber
class << self
diikuti olehalias_method :a_new_class_method, :a_class_method
Anda benar-benar memanggilalias_method
kelas singletonFoo
. Cara lain untuk menulis ini adalah:singleton_class.alias_method :a_new_class_method, :a_class_method
dalam konteks kelas.alias_method
beroperasi pada instance, jadi Anda harus naik satu tingkat lebih dalam dan beroperasi padaClass
instance, atau metaclass kelas . Ruby memiliki model objek liar yang bisa merusak otak, tetapi juga memberi Anda banyak kekuatan:sumber