Di Ruby, bagaimana Anda memanggil metode kelas dari salah satu instance kelas itu? Katakan saya punya
class Truck
def self.default_make
# Class method.
"mac"
end
def initialize
# Instance method.
Truck.default_make # gets the default via the class's method.
# But: I wish to avoid mentioning Truck. Seems I'm repeating myself.
end
end
baris Truck.default_make
mengambil default. Tetapi apakah ada cara untuk mengatakan ini tanpa menyebutkan Truck
? Sepertinya harus ada.
ruby
class-method
Peter
sumber
sumber
SalesforceSyncJob
lebih pendek;)self.class
menghilangkan kebutuhan untuk mencari / mengganti jika Anda mengubah nama kelas.Menggunakan
self.class.blah
TIDAK sama dengan menggunakanClassName.blah
ketika datang ke warisan.sumber
self.class
benar untuk mempertahankan warisan. meskipunmake1()
didefinisikan dalamTruck
, itu adalahBigTruck
metode kelas referensi .Untuk mengakses metode kelas di dalam metode contoh, lakukan hal berikut:
Berikut ini solusi alternatif untuk masalah Anda:
Sekarang mari kita gunakan kelas kita:
sumber
Jika Anda memiliki akses ke metode delegasi Anda dapat melakukan ini:
Atau, dan mungkin lebih bersih jika Anda memiliki lebih dari satu atau dua metode yang ingin Anda delegasikan ke kelas & contoh:
Sebuah kata peringatan:
Jangan hanya secara acak
delegate
segala sesuatu yang tidak mengubah status ke kelas dan instance karena Anda akan mulai mengalami masalah nama clash yang aneh. Lakukan ini dengan hemat dan hanya setelah Anda memeriksa tidak ada lagi yang tergencet.sumber
sumber
Anda melakukannya dengan cara yang benar. Metode kelas (mirip dengan metode 'statis' dalam C ++ atau Java) bukan bagian dari instance, jadi mereka harus dirujuk secara langsung.
Pada catatan itu, dalam contoh Anda, Anda akan lebih baik disajikan membuat 'default_make' metode biasa:
Metode kelas lebih berguna untuk fungsi tipe utilitas yang menggunakan kelas. Sebagai contoh:
sumber
default_make
harus menjadi metode instan. Sekalipun lebih sederhana untuk contoh-contoh ini, ini bukan semantik yang tepat - standarnya adalah produk kelas, bukan objek yang termasuk kelas.Satu lagi:
sumber
Berikut ini adalah pendekatan tentang bagaimana Anda dapat menerapkan
_class
metode yang berfungsiself.class
untuk situasi ini. Catatan: Jangan gunakan ini dalam kode produksi, ini hanya untuk kepentingan :)Dari: Dapatkan Anda membuat kode dalam konteks pemanggil di Ruby? dan juga http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Mungkin jawaban yang tepat adalah mengirim tambalan untuk Ruby :)
sumber
Serupa dengan pertanyaan Anda, Anda dapat menggunakan:
sumber