29

Si j'ai une classe avec un attr_accessor, il crée par défaut une variable d'instance avec les getters et setters correspondants. Mais au lieu de créer une variable d'instance, existe-t-il un moyen de l'obtenir pour créer une variable de classe ou une variable d'instance de classe à la place?Comment attr_accessor de Ruby peut-il produire des variables de classe ou des variables d'instance de classe au lieu de variables d'instance?

+0

Faites votre chemin à travers "[Voir clairement les métaclasses] (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)"; C'est très utile quand on essaie de comprendre le fonctionnement des classes et des objets de Ruby. –

Répondre

46

Comme ceci:

class TYourClass 
    class << self 
    attr_accessor :class_instance_variable 
    end 
end 

Vous pouvez considérer cela comme l'ouverture de la métaclasse de la classe (dont la classe elle-même est une instance) et en ajoutant un attribut à lui.

attr_accessor est une méthode de la classe Class, elle ajoute deux méthodes à la classe, l'une qui lit la variable d'instance et l'autre qui la définit. Voici une mise en œuvre possible:

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 

accesseur attribut class complètement non testé:

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

Merci. J'aime ta façon de dire qu'elle ouvre la métaclasse de la classe et les sortes d'addenda. Mais pourquoi produit-il une variable d'instance de classe au lieu d'une variable de classe? Et serait-il possible de l'obtenir pour produire une variable de classe aussi ou cette syntaxe ne fonctionnerait que pour les variables d'instance de classe? –

+0

C'est différent, voir encore –

+0

Cela ne fonctionnera que pour les variables d'instance de classe, b/c attr_ * définit des méthodes pour les variables d'instance (d'un objet). – rampion

20

Dans Rails (ou partout où vous faites require 'active_support') vous pouvez utiliser cattr_accessor :name pour obtenir la vraie classe accesseurs variables.

Les variables d'instance de classe que d'autres ont signalées sont généralement plus utiles. Le APIdock cattr_accessor page a une discussion utile clarifiant quand vous voulez l'un pas l'autre, plus la source aux fonctions cattr_accessor, cattr_reader et cattr_writer.

+0

beaucoup plus facile - ne savait pas les rails offerts ceci. Merci! –

Questions connexes