Почему следует избегать @@ class_variables в Ruby? - PullRequest
14 голосов
/ 24 сентября 2010

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

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

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

Ответы [ 2 ]

27 голосов
/ 24 сентября 2010

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

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

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

6 голосов
/ 24 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...