Se ho una classe con un attr_accessor
, per impostazione predefinita crea una variabile di istanza insieme ai getter e setter corrispondenti. Ma invece di creare una variabile di istanza, esiste un modo per farlo invece creare una variabile di classe o una variabile di istanza di classe?Come può attr_accessor di Ruby produrre variabili di classe o istanze di classe invece di variabili di istanza?
risposta
Ti piace questa:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Si può guardare a questo come l'apertura del metaclasse della classe (di cui la classe stessa è un esempio) e l'aggiunta di un attributo ad esso.
attr_accessor
è un metodo della classe Class
, aggiunge due metodi alla classe, uno che legge la variabile di istanza e altro che lo imposta. Ecco una possibile implementazione:
class Class
def my_attr_accessor(name)
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |new_val|
instance_variable_set "@#{name}", new_val
end
end
end
Completamente testato attributo di classe di accesso:
class Class
def class_attr_accessor(name)
define_method name do
class_variable_get "@@#{name}"
end
define_method "#{name}=" do |new_val|
class_variable_set "@@#{name}", new_val
end
end
end
Grazie. Mi piace il tuo modo di dire che apre il metaclass della classe e aggiunge un addendum. Ma perché produce una variabile di istanza di classe invece di una variabile di classe? E sarebbe possibile ottenere che produca anche una variabile di classe o questa sintassi funzionerebbe solo per le variabili di istanza di classe? –
I'ts different, see answer again –
Questo funzionerà solo per le variabili di istanza di classe, b/c attr_ * definisce i metodi per le variabili di istanza (di qualche oggetto). – rampion
In Rails, (o dovunque si fa require 'active_support'
) è possibile utilizzare cattr_accessor :name
per ottenere le funzioni di accesso variabili vera classe.
Le variabili di istanza di classe che altri hanno evidenziato sono in genere più utili. Lo APIdock cattr_accessor
page ha alcune discussioni utili che chiariscono quando si desidera uno non l'altro, oltre alla fonte delle funzioni cattr_accessor
, cattr_reader
e cattr_writer
.
molto più facile - non sapeva che le rotaie lo offrivano. Grazie! –
Fatevi strada attraverso "[Vedi chiaramente Metaclasses] (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)"; è molto utile quando si cerca di capire come funzionano le classi e gli oggetti di Ruby. –