Je peux comprendre pourquoi vous auriez besoin d'une variable de classe pour garder une trace de choses comme le nombre total d'objets qui ont été instanciés dans cette classe.Avez-vous déjà utilisé une "variable d'instance de classe" dans votre code Ruby?
Et je peux comprendre pourquoi vous auriez besoin d'une variable d'instance pour stocker les attributs d'un objet particulier dans cette classe.
Mais variables d'instance de classe Je ne peux pas sembler justifier. Si je comprends bien, ils sont comme les variables de classe, sauf qu'ils sont non visibles aux sous-classes comme les variables de classe.
Il semble que les utilisations pour ce serait très limité. Ou ai-je tort? Quelqu'un at-il trouvé un bon usage des variables d'instance de classe dans leur code? Ou pourriez-vous donner un exemple d'une situation où ce type de nuance serait utile?
Merci. Grand exemple (s).Donc, fondamentalement, si nous avions seulement des variables de classe, nous ne serions pas capables de faire des choses comme ces comptes localisés pour A, B et C - nous serions coincés avec l'équivalent de vos num_subclass_instances. Je pense que je comprends maintenant. La seule partie de votre code que je n'ai pas comprise était: def self.inherited (subclass) subclass.instance_eval {@count = 0} end. Qu'est-ce que ça fait? –
J'ai donc initialisé @count dans la définition de A, mais j'avais besoin d'initialiser @count à 0 pour toutes les sous-classes de A, ce que fait ce code. Lorsque A est hérité par 'subclass', nous ouvrons la sous-classe et initialisons son @count à 0. Essayez de supprimer cela, et vous verrez NoMethodErrors lorsque B et C sont instanciés, puisque Ruby ne saura pas comment ajouter 1 à zéro (la valeur par défaut de @count si elle n'est pas instanciée) – rampion
Got it. Merci. En passant, je cherchais de la documentation sur instance_eval et l'ai trouvé pour 1.87 (http://www.rubybrain.com/api/ruby-1.8.7/doc/index.html?a=M000295&name=instance_eval) mais il semble comme c'est passé de 1,90 (http://www.rubybrain.com/api/ruby-1.9.0.2/doc/index.html?a=C00000022&name=Object). –