Why should @@class_variables be avoided in Ruby?

前端 未结 2 2000
没有蜡笔的小新
没有蜡笔的小新 2021-02-13 11:55

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 th

相关标签:
2条回答
  • 2021-02-13 12:03

    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.

    0 讨论(0)
  • 2021-02-13 12:15

    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

    0 讨论(0)
提交回复
热议问题