7
votes

Écrire un attribut héritable par rapport à la mission de base dans les rails

Juste curieux de savoir quelle est la différence entre ces deux dans un rails GEM: xxx

Je n'ai pu trouver aucune bonne documentation sur write_inhéritaire_attribute , et il suffisait de lire à travers une source de gemme et a trouvé l'ancien utilisé plusieurs fois. Merci!


0 commentaires

3 Réponses :


5
votes

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 wreck_inhéritaire_attribute 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 .

En bref, lorsque vous écrivez foo.sample = "échantillon" 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") Vous avez beaucoup plus de contrôle sur ce qui se passe.


3 commentaires

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.



13
votes

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


0 commentaires

2
votes

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


0 commentaires