29 votes

Comment Ruby attr_accessor peut-il produire des variables de classe ou des variables d'instance de classe au lieu de variables d'instance?

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?

46voto

krusty.ar Points 3141

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

20voto

Charles Dale Points 386

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.

18voto

Martin DeMello Points 4811

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X