Why should @@class_variables be avoided in Ruby?
Asked Answered
U

2

14

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?

Unrounded answered 24/9, 2010 at 12:44 Comment(2)
I've quite recently read two books about Ruby and neither of them mentioned this so interesting to see what answers you'll get :)Opening
See also Difference between class variables and class instance variables?.Rooseveltroost
L
27

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.

Lagrange answered 24/9, 2010 at 13:5 Comment(0)
A
6

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

Aureole answered 24/9, 2010 at 13:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.