I know that some say that class variables (e.g. @@class_var
) should be avoid in Ruby and should use the an instance variable (e.g. @instance_var
) in the class scope instead:
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Why is the use of class variables frowned upon in Ruby?
Class variables are often maligned because of their sometimes confusing behavior regarding inheritance:
class Foo
@@foo = 42
def self.foo
@@foo
end
end
class Bar < Foo
@@foo = 23
end
Foo.foo #=> 23
Bar.foo #=> 23
If you use class instance variables instead, you get:
class Foo
@foo = 42
def self.foo
@foo
end
end
class Bar < Foo
@foo = 23
end
Foo.foo #=> 42
Bar.foo #=> 23
This is often more useful.
Be careful; class @@variables
and instance @variables
are not the same thing.
Essentially, when you declare a class
variable in a base class, it’s shared
with all subclasses. Changing its
value in a subclass will affect the
base class and all of its subclasses
all the way down the inheritance tree.
This behavior is often exactly what’s
desired. But equally often, this
behavior is not what was intended by
the programmer, and it leads to bugs,
especially if the programmer did not
originally expect for the class to be
subclassed by someone else.
From: http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby