Search code examples
rubyclass-variablesclass-instance-variables

Why should @@class_variables be avoided in Ruby?


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?


Solution

  • 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.