Почему в Ruby следует избегать @@class_variables?

Я знаю, что некоторые говорят, что переменных класса (например, @@class_var) следует избегать в Ruby и вместо этого следует использовать переменную экземпляра (например, @instance_var) в области класса:

def MyClass
  @@foo = 'bar' # Should not do this.
  @foo = 'bar'  # Should do this.
end

Почему использование переменных класса осуждается в Ruby?


person agentbanks217    schedule 24.09.2010    source источник
comment
Я совсем недавно прочитал две книги о Ruby, и ни одна из них не упомянула об этом, поэтому интересно посмотреть, какие ответы вы получите :)   -  person willcodejavaforfood    schedule 24.09.2010
comment


Ответы (2)


Переменные класса часто злословят из-за их иногда запутанного поведения в отношении наследования:

class Foo
  @@foo = 42

  def self.foo
    @@foo
  end
end

class Bar < Foo
  @@foo = 23
end

Foo.foo #=> 23
Bar.foo #=> 23

Если вместо этого вы используете переменные экземпляра класса, вы получаете:

class Foo
  @foo = 42

  def self.foo
    @foo
  end
end

class Bar < Foo
  @foo = 23
end

Foo.foo #=> 42
Bar.foo #=> 23

Это часто более полезно.

person sepp2k    schedule 24.09.2010

Будь осторожен; класс @@variables и экземпляр @variables — это не одно и то же.

По сути, когда вы объявляете переменную класса в базовом классе, она используется всеми подклассами. Изменение его значения в подклассе повлияет на базовый класс и все его подклассы на всем пути вниз по дереву наследования. Такое поведение часто является именно тем, что желательно. Но столь же часто такое поведение не соответствует тому, что было задумано программистом, и приводит к ошибкам, особенно если программист изначально не ожидал, что класс станет подклассом кем-то другим.

Откуда: http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby

person NullUserException    schedule 24.09.2010