La cosa importante da capire è che non esiste un metodo di classe in Ruby.
Un metodo di classe è in realtà solo un metodo singleton. Non c'è niente di speciale nei metodi di classe. Ogni oggetto può avere metodi singleton. Li chiamiamo semplicemente "metodi di classe" quando l'oggetto è un Class
"metodo singleton di un'istanza di Class
" troppo lungo e ingombrante.
Aspettare! Ho detto "metodo singleton"?
Un'altra cosa importante da capire è che non esiste un metodo singleton in Ruby.
Un metodo singleton è in realtà solo un normale metodo noioso della vecchia istanza della classe singleton. Non c'è niente di speciale nei metodi singleton. Sono solo metodi di istanza come qualsiasi altro metodo di istanza.
In realtà, Ruby ha solo metodi di istanza. Nessuna funzione, nessun costruttore, nessun metodo statico, nessun metodo di classe, nessuna funzione di modulo, nessun metodo singleton.
La domanda non è "è un metodo di classe, è un metodo singleton", ma piuttosto "in quale modulo è definito questo metodo?"
I "metodi Singleton" sono in realtà metodi di istanza definiti nella classe singleton. La sintassi per accedere alla classe singleton di foo
è
class << foo
end
Esiste anche un metodo Object#singleton_class
che restituisce la classe singleton di un oggetto.
Perché sto martellando così aggressivamente sul fatto che ogni metodo è un metodo di istanza e che i metodi di classe non esistono? Perché significa che il modello a oggetti di Ruby è molto più semplice di quanto la gente pensi che sia! Dopotutto, nella tua domanda, mostri già che sai come alias metodi di istanza, ma dici che non sai come alias metodi di classe. Ma è sbagliato! Si fa sapere come metodi di classe alias, perché sono solo metodi di istanza . Se ti fosse stato insegnato questo fatto correttamente, non avresti mai avuto bisogno di porre questa domanda!
Una volta compreso che ogni metodo è un metodo di istanza e che quelli che chiamiamo "metodi singleton" sono solo metodi di istanza della classe singleton, la soluzione diventa chiara:
singleton_class.alias_method :a_new_class_method, :a_class_method
Nota: quando ho scritto sopra che "non esiste una cosa come X", intendevo dire che "non esiste una cosa come X nel linguaggio Ruby ". Ciò non significa che quei concetti non esistano nella comunità di Ruby .
Parliamo regolarmente di "metodi singleton" e "metodi di classe", semplicemente perché è più facile che parlare di "metodi di istanza della classe singleton" o "metodi di istanza della classe singleton di un oggetto che risulta essere un'istanza della Class
classe ". Ci sono metodi anche come Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, e Module#module_function
nella libreria di base di Ruby. Ma è sempre importante ricordare che quelli non sono concetti linguistici. Questi sono concetti di comunità che esistono solo nelle nostre teste e nei nomi di alcuni metodi di biblioteca.
extend ClassMethods
soluzione. +1