Juste curieux de savoir quelle est la différence entre ces deux dans un rails GEM: Je n'ai pu trouver aucune bonne documentation sur write_inhéritaire_attribute code>, et il suffisait de lire à travers une source de gemme et a trouvé l'ancien utilisé plusieurs fois. Merci! P> p>
3 Réponses :
Pour une classe ou un module simple, il n'y aurait pas de différence, mais avec des modules plus complexes pouvant être chargés avec plusieurs autres modules, des méthodes telles que En bref, lorsque vous écrivez wreck_inhéritaire_attribute code> peuvent vous aider à modifier facilement des objets facilement et de manière fiable. Sans avoir à s'inquiéter de la portée, des méthodes privées / protégées et de toutes sortes d'interférences de la magie de métaprogramming Ruby comme Method_missing Code>. p>
foo.sample = "échantillon" code> Il existe toutes sortes de choses qui peuvent arriver avant, après ou au lieu de définir l'attribut, surtout si l'objet utilise ActiveModel ou un ormes. Lorsque vous utilisez foo.write_inhéritaire_attribute (: exemple, "échantillon") code> Vous avez beaucoup plus de contrôle sur ce qui se passe. P>
Merci. Vous n'êtes toujours pas sûr de bien comprendre mais apprécier la réponse.
Il est difficile d'expliquer certaines des fonctionnalités avancées de Ruby, à moins que vous n'ayez beaucoup de contexte. Je recommande vivement le livre "MetaProgramming Ruby" pour une explication excellente et accessible de ce type de fonctionnalités: PragProg .Com / Titres / PPMetr / MetaProgramming-Ruby
Merci. C'est sur ma bibliothèque en attendant mes yeux. Je vais lui donner une fissure ce week-end probablement.
Sous-classes n'héritez pas de variables d'instance:
>> class B ; end >> B.write_inheritable_attribute(:candy, 7) # => 7 >> class C < B ; end >> C.read_inheritable_attribute(:candy) # => 7
L'attribut héritable a été mis en œuvre principalement pour résoudre le problème dans lequel la variable de la classe Ruby est partagée dans l'héritage de la classe. Considérez cet exemple
Counter.count: 0 DogCounter.count: 0 -> nice, DogCounter inherits count from Counter ==> DogCounter increment DogCounter.count: 1 -> as expected Counter.count: 0 -> nice, it doesn't change count for Counter ==> Counter increment Counter.count: 1 DogCounter.count: 1 -> now each subclass can have their own class attribute that inherits default value from the superclass