Hi -- On Fri, 9 Feb 2007, oinkoink wrote: > There's been a lot of blog traffic lately about class variables vs. > class instance variables. I'd like to give an example of something > in-between: class-tree variables. These are sort of like class > variables, but they only point downward in the inheritance tree > rather than up. That is, each class in an inheritance tree can get > a variable which refers to itself and all its descendents. > Class-tree variables are implemented by class variables, but the > implementation occurs only in the top (root) class and is inherited > by the rest of the tree. I think that's a typo; I don't see any class variables in your code. > It is probably unclear what the heck I am talking about, but the > following example should make things clear. > > # class_tree_var.rb: demo program of class-tree variables > #-- Hey Emacs! Use -*- mode: ruby; coding: utf-8-unix; -*- > class Person > attr_accessor :name > > class << self > attr_writer :instances > def instances > @instances ||= [] > end > end > > def initialize( name ) > klass = self.class > until klass == Person > klass.instances << self > klass = klass.superclass > end > Person.instances << self > @name = name > end > > end > > class Scholar < Person > end > class Student < Scholar > end > class Professor < Scholar > end > %w(Fred Barney).each{|caveman| Person.new(caveman)} > %w(Wilma Betty).each{|cavewoman| Scholar.new(cavewoman)} > %w(Twerply Bob Sheila).each{|brat| Student.new(brat)} > %w(Whiplash Grindemdown).each{|sadist| Professor.new(sadist)} > puts "Persons are " + Person.instances.collect{|person| > person.name}.join(', ') > puts "Scholars are " + Scholar.instances.collect{|scholar| > scholar.name}.join(', ') > puts "Students are " + Student.instances.collect{|student| > student.name}.join(', ') > puts "Professors are " + Professor.instances.collect{|professor| > professor.name}.join(', ') > # end of file > > $ ruby class_tree_var.rb > Persons are Fred, Barney, Wilma, Betty, Twerply, Bob, Sheila, > Whiplash, Grindemdown > Scholars are Wilma, Betty, Twerply, Bob, Sheila, Whiplash, Grindemdown > Students are Twerply, Bob, Sheila > Professors are Whiplash, Grindemdown > > I don't actually recommend this. I think that in Ruby it's better > not to use inheritance for such things; you have an abundance of > alternatives that are more flexible. Functionality built into > inheritance tends to break upon refactoring. But I think this > example does shed some light on what class instance variables are > capable of. It did for me, anyway. It's a good illustration of the fact that instance variables are the way to maintain state per object, and that that's the same for class objects as for other objects. David -- Q. What is THE Ruby book for Rails developers? A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black) (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf) Q. Where can I get Ruby/Rails on-site training, consulting, coaching? A. Ruby Power and Light, LLC (http://www.rubypal.com)