Si j'ai une classe avec un attr_accessor
, elle 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'amener à créer une variable de classe ou une variable d'instance de classe à la place?
Réponses
Trop de publicités?Comme ceci:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Vous pouvez regarder ce que l'ouverture de la métaclasse de la classe (dont la classe elle-même est un exemple) et l'ajout d'un attribut.
attr_accessor
est une méthode de la classe Class
, il ajoute deux méthodes de la classe, celui qui lit la variable d'instance, et d'autres qui le définit. Voici une implémentation 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
Complètement non testé attribut de classe accesseur:
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
Dans Rails, (ou partout où vous require 'activesupport'
) vous pouvez utiliser cattr_accessor :name
pour obtenir les vrais accesseurs de variables de classe.
Les variables d'instance de classe que d'autres ont signalées sont généralement plus utiles. La page APIdock cattr_accessor contient des informations utiles pour clarifier le moment où vous souhaitez l'un et pas l'autre, ainsi que la source des fonctions cattr_accessor / reader / writer.
Parcourez « Voir clairement les métaclasses »; c'est très utile lorsque vous essayez de comprendre le fonctionnement des classes et des objets de Ruby.