Attr_accessor sur les variables de classe

attr_accessor ne fonctionne pas sur le code suivant. L’erreur indique ” undefined method 'things' for Parent:Class (NoMethodError) “:

 class Parent @@things = [] attr_accessor :things end Parent.things << :car p Parent.things 

Cependant, le code suivant fonctionne

 class Parent @@things = [] def self.things @@things end def things @@things end end Parent.things << :car p Parent.things 

attr_accessor définit des méthodes d’ attr_accessor pour une instance. Si vous voulez des accesseurs générés automatiquement au niveau de la classe, vous pouvez l’utiliser sur la métaclasse

 class Parent @things = [] class << self attr_accessor :things end end Parent.things #=> [] Parent.things << :car Parent.things #=> [:car] 

mais notez que cela crée une variable d’instance de niveau de classe et non une variable de classe. C’est probablement ce que vous voulez de toute façon, car les variables de classe se comportent différemment, alors vous pourriez vous attendre à traiter avec l’inheritance. Voir ” Variables de classe et d’instance dans Ruby “.

attr_accessor génère des accesseurs pour les variables d’ instance . Les variables de classe dans Ruby sont très différentes, et elles ne sont généralement pas ce que vous voulez. Ce que vous voulez probablement ici, c’est une variable d’instance de classe. Vous pouvez utiliser attr_accessor avec des variables d’instance de classe telles que:

 class Something class < 

Ensuite, vous pouvez écrire Something.things = 12 et cela fonctionnera.

Juste quelques éclaircissements: les variables de classe ne seront pas accessibles en utilisant attr_accessor . Il s’agit de variables d’instance:

 class SomeClass class << self attr_accessor :things end @things = [] end 

car en Ruby, la classe est une instance de la classe "Class" (Dieu, j'aime le dire) et attr_accessor définit des méthodes d' attr_accessor pour les variables d'instance.

C’est probablement le moyen le plus simple.

 class Parent def self.things @@things ||= [] end end Parent.things << :car p Parent.things 

Notez également qu’une méthode singleton est une méthode pour un seul object. Dans Ruby, une classe est aussi un object, donc il peut aussi avoir des méthodes singleton! Alors, soyez conscient du moment où vous pourriez les appeler.

Exemple:

 class SomeClass class << self def test end end end test_obj = SomeClass.new def test_obj.test_2 end class << test_obj def test_3 end end puts "Singleton methods of SomeClass" puts SomeClass.singleton_methods puts '------------------------------------------' puts "Singleton methods of test_obj" puts test_obj.singleton_methods 

Méthodes Singleton de SomeClass

tester


Méthodes singleton de test_obj

test_2

test_3