Ich kann verstehen, warum Sie eine Klassenvariable benötigen, um Dinge wie die Gesamtzahl der Objekte, die in dieser Klasse instanziiert wurden, zu verfolgen.Haben Sie jemals eine "Klasseninstanzvariable" in Ihrem Ruby-Code verwendet?
Und ich kann verstehen, warum Sie eine Instanzvariable benötigen, um Attribute eines bestimmten Objekts in dieser Klasse zu speichern.
Aber Klasse Instanzvariablen Ich kann einfach nicht zu rechtfertigen scheinen.
Wie ich es verstehe, sind sie genau wie Klassenvariablen, außer dass sie für Unterklassen nicht sichtbar sind, wie Klassenvariablen sind.
Es scheint, dass die Verwendung dafür ziemlich begrenzt wäre. Oder liege ich falsch? Hat jemand eine gute Verwendung für Klasseninstanzvariablen in ihrem Code gefunden? Oder könnten Sie ein Beispiel geben für eine Situation, in der diese Art von Nuance wertvoll wäre?
Danke. Großes Beispiel (s).Also, im Grunde, wenn wir nur Klassenvariablen hätten, wären wir nicht in der Lage, Dinge wie diese lokalisierten Zählungen für A, B und C zu tun - wir würden mit dem Äquivalent Ihrer num_subclass_instances festhalten. Ich denke, ich verstehe es jetzt. Der einzige Teil Ihres Codes, den ich nicht verstanden habe, war: def self.inherited (Unterklasse) subclass.instance_eval {@count = 0} end. Was macht das? –
Also initiierte ich A @ count in der Definition von A, aber ich musste @ count für alle Unterklassen von A auch auf 0 initialisieren, was dieser Code tut. Wenn A von "subclass" geerbt wird, öffnen wir die Unterklasse und initialisieren ihren @ count auf 0. Versuchen Sie, das zu entfernen, und NoMethodErrors wird angezeigt, wenn B und C instanziiert werden, da Ruby nicht weiß, wie man 1 zu null addiert (der Standardwert von @count wenn nicht instanziiert) – rampion
Got it. Vielen Dank. By the way, ich suchte nach Dokumentation auf instance_eval und fand es für 1.87 (http://www.rubybrain.com/api/ruby-1.8.7/doc/index.html?a=M000295&name=instance_eval) aber es sieht so aus wie es von 1.90 weg ist (http://www.rubybrain.com/api/ruby-1.9.0.2/doc/index.html?a=C00000022&name=Object). –