Class

Переменные класса определяются с знака @@ и должны быть инициализированы, прежде чем их можно будет использовать в определениях методов. Обращение к неинициализированной переменной класса приводит к ошибке. Переменные класса являются общими для всех потомков класса или модуля, в котором они определены, а так же их инстансов.

class BaseClass
@@class_variable = 100

def test_method
@@class_variable
end
end

class MyClass < BaseClass
def class_variable_present?
defined?(@@class_variable) == "class variable"
end
end

BaseClass.new.class_variable # => 100
MyClass.new.class_variable_present? # => true

Экземпляр класса MyClass может получить доступ к значению @@class_variable, даже если оно определено в классе BaseClass.

Использование переменных класса обычно не рекомендуется, и этому есть как минимум две причины:

  1. 1) Изменение переменной класса в дочернем классе изменит значение этой переменной класса в родительском классе.
  2. 2) Если переменная класса определена в дочернем классе, а затем та же переменная класса определена в родительском классе, это приведет к ошибке RuntimeError.

Вместо использования переменных класса вы можете рассмотреть возможность использования инстансных переменных класса, поскольку они специфичны для одного класса и не проявляют неожиданного поведения, упомянутого выше.