Class variables vs Class instance variables in Ruby

Ruby posted over 4 years ago by christian

Class variables (available to whole inheritance tree) and class instance variables (private to the class) in Ruby can be confusing:

   1  class Foo
   2    @@cls_var = 'foo'
   3    @cls_instvar = 'foo'
   4  
   5    def test
   6      p "instance:"
   7      p "  class variable: #{@@cls_var}"
   8      p "  class instance variable: #{@cls_instvar}"
   9    end
  10  
  11    def self.test
  12      p "class:"
  13      p "  class variable: #{@@cls_var}"
  14      p "  class instance variable: #{@cls_instvar}"
  15    end
  16  end
  17  
  18  class Bar < Foo
  19    @@cls_var = 'bar'
  20    @cls_instvar = 'bar'
  21  end
  22  
  23  f = Foo.new
  24  p "------------"
  25  p "Foo"
  26  p "------------"
  27  f.test
  28  p "~~~~~~~~~~~~"
  29  Foo.test
  30  
  31  p "------------"
  32  p "Bar"
  33  p "------------"
  34  b = Bar.new
  35  b.test
  36  p "~~~~~~~~~~~~"
  37  Bar.test

Output is:

   1  ------------
   2  Foo
   3  ------------
   4  instance:
   5      class variable: bar
   6      class instance variable: 
   7  ~~~~~~~~~~~~
   8  class:
   9      class variable: bar
  10      class instance variable: foo
  11  ------------
  12  Bar
  13  ------------
  14  instance:
  15      class variable: bar
  16      class instance variable: 
  17  ~~~~~~~~~~~~
  18  class:
  19      class variable: bar
  20      class instance variable: bar

Tagged ruby, class, variable, instance