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?
Répondre
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
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? –
C'est différent, voir encore –
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
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
.
beaucoup plus facile - ne savait pas les rails offerts ceci. Merci! –
- 1. Variables de cache ou de classe?
- 2. Variables de classe thread-safe Ruby
- 3. Java - Classe abstraite pour contenir des variables?
- 4. PHP inclure des fonctions de classe avec des variables
- 5. Comment puis-je obtenir uniquement des variables de classe?
- 6. Comment donner des variables JavaScript à partir de variables ASP.NET?
- 7. Déclaration des variables réutilisées au niveau de la classe ou de la méthode lorsqu'elles sont requises
- 8. importer toutes les variables de classe parente
- 9. Objective C Static Classe Variables de niveau
- 10. Accès variables et méthodes en dehors des définitions de classe
- 11. variables à l'intérieur des variables
- 12. Variables de classe dans les vues de rails?
- 13. C# Variables de variables membres utilisées par la méthode de la classe de base
- 14. PHP: la portée des variables Question/Variables
- 15. Grand nombre de variables à l'intérieur d'une classe de conteneur
- 16. Transférer des arguments variables
- 17. Drupal 6 passer des variables de formulaires au contenu, comment?
- 18. Substitution de variables membres de classe en Python (Django/Satchmo)
- 19. PHP Variables variables
- 20. Gestion des rôles variables
- 21. variables de classe objective-c: quand callloc est appelé?
- 22. Dans ObjectiveC, les pointeurs sont-ils des variables d'instance de classe initialisées à 'nil' ou non?
- 23. Annotation de variables locales ou de paramètres de méthode
- 24. déterminer le type d'accès des variables membres d'une classe
- 25. Quand les variables de classe sont-elles chargées?
- 26. Référencement des variables d'instance AppDelegate
- 27. Passer des variables du formulaire principal au formulaire de saisie
- 28. Impression de variables LaTeX
- 29. PHP __get et les variables de classe privée
- 30. AS2: charger les variables de classe avec sendandload
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. –