Robert Klemme
7/3/2005 12:49:00 PM
James Edward Gray II <james@grayproductions.net> wrote:
> On Jul 2, 2005, at 3:05 PM, Devin Mullins wrote:
>
>> OK, now I'm confused. I had thought that class variables were just
>> instance variables of the Test object, but it seems that the case
>> is much weirder than that. (Why?)
>
> We already have a syntax for instance variables, so that's what you
> use if you want an instance variable on test. The reason class
> variables don't work like that is that they would then by tricky to
> reach fro instance objects of the class and that wouldn't be good at
> all.
Let me add to that that usually you want to associate a variable with the
class instance or with instances. Class variables (the ones with @@) have
some strange properties that sometimes lead to surprising behavior. I
generally recommend to not use them. Instance variables in classes are much
simpler to handle and much clearer and cleaner IMHO.
Just a simple example where each new instance gets assigned a serial number:
class Foo
@cnt = 0
def self.tick() @cnt += 1 end
attr_reader :serial
def initialize
@serial = self.class.tick
end
end
?> instances = (1..10).map { Foo.new }
=> [#<Foo:0x1017e248 @serial=1>, #<Foo:0x1017e1a0 @serial=2>,
#<Foo:0x1017e0e0 @serial=3>, #<Foo:0x1017dff0 @serial=4>, #<Foo:0x1017
df60 @serial=5>, #<Foo:0x1017deb8 @serial=6>, #<Foo:0x1017de58 @serial=7>,
#<Foo:0x1017ddc8 @serial=8>, #<Foo:0x1017dd50 @serial=9>,
#<Foo:0x1017dca8 @serial=10>]
>> instances.map {|f| f.serial}
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Note that this has to be changed slightly if you want to inherit from Foo.
I just didn't want to make this overly complicated.
Kind regards
robert