29

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?

+0

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. –

risposta

46

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 
+0

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? –

+0

I'ts different, see answer again –

+0

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

20

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.

+0

molto più facile - non sapeva che le rotaie lo offrivano. Grazie! –

Problemi correlati