Anlaşılması gereken önemli şey , Ruby'de sınıf yöntemi diye bir şey olmamasıdır .
Bir sınıf yöntemi gerçekten sadece tek bir yöntemdir. Sınıf yöntemleri hakkında özel bir şey yoktur. Her nesnenin singleton yöntemleri olabilir. Nesne bir Class
"örneğinin singleton yöntemi Class
" çok uzun ve hantal olduğu için onlara "sınıf yöntemleri" diyoruz .
Bekle! "Tekil yöntem" mi dedim?
Anlaşılması gereken bir diğer önemli şey de Ruby'de tekil yöntem diye bir şey olmadığıdır .
Singleton yöntemi, gerçekten de singleton sınıfının normal sıkıcı eski örnek yöntemidir. Singleton yöntemleri hakkında özel bir şey yoktur. Bunlar sadece diğer örnek yöntemleri gibi örnek yöntemleridir.
Aslında, Ruby'nin yalnızca örnek yöntemleri vardır. İşlev yok, kurucu yok, statik yöntem yok, sınıf yöntemi yok, modül işlevi yok, tekil yöntem yok.
Soru "bu bir sınıf yöntemi mi, bu tek bir yöntem mi" değil, " bu yöntem hangi modülde tanımlanıyor?"
"Singleton yöntemleri" gerçekten singleton sınıfında tanımlanan örnek yöntemlerdir. Singleton sınıfına erişim sözdizimi foo
şöyledir:
class << foo
end
Object#singleton_class
Bir nesnenin singleton sınıfını döndüren bir yöntem de vardır .
Neden bu kadar agresif bir şekilde her yöntemin bir örnek yöntem olduğu ve sınıf yöntemlerinin olmadığı gerçeğine dikkat çekiyorum? Çünkü Ruby'nin nesne modelinin insanların düşündüğünden çok daha basit olduğu anlamına geliyor! Sonuçta, sorunuzda, örnek yöntemlerini nasıl takma yapacağınızı bildiğinizi, ancak sınıf yöntemlerini nasıl takma yapacağınızı bilmediğinizi söylüyorsunuz. Ama bu yanlış! Sen bunu çünkü nasıl takma sınıf yöntemleri bilmek onlar sadece örnek yöntemlerdir . Bu gerçeği düzgün bir şekilde öğrenmiş olsaydınız, bu soruyu asla sormanıza gerek kalmazdı!
Her yöntemin bir örnek yöntemi olduğunu ve "singleton yöntemleri" olarak adlandırdığımız şeyin yalnızca singleton sınıfının örnek yöntemleri olduğunu anladıktan sonra çözüm netleşir:
singleton_class.alias_method :a_new_class_method, :a_class_method
Not: Yukarıda "X diye bir şey yok" yazdığımda, demek istediğim " Ruby dilinde X diye bir şey yok " idi. Bu, bu kavramların Ruby topluluğunda mevcut olmadığı anlamına gelmez .
Biz düzenli olarak "tekil sınıfının örnek yöntemlerinden" veya bir örneği olur bir nesnenin tekil sınıfının "örneği yöntemleri hakkında konuşurken daha kolaydır çünkü, "tekil yöntemleri" ve "sınıf yöntemleri" hakkında konuşmak Class
sınıfta ". Gibi yöntemler de vardır Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, ve Module#module_function
Ruby çekirdek kütüphane. Ancak bunların dil kavramları olmadığını hatırlamak her zaman önemlidir . Bunlar sadece kafamızda ve bazı kütüphane yöntemlerinin adlarında var olan topluluk kavramlarıdır .
extend ClassMethods
Çözümü unuttum . +1