Переменные класса определяются с знака @@ и должны быть инициализированы, прежде чем их можно будет использовать в определениях методов. Обращение к неинициализированной переменной класса приводит к ошибке. Переменные класса являются общими для всех потомков класса или модуля, в котором они определены, а так же их инстансов.
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) Изменение переменной класса в дочернем классе изменит значение этой переменной класса в родительском классе.
- 2) Если переменная класса определена в дочернем классе, а затем та же переменная класса определена в родительском классе, это приведет к ошибке RuntimeError.
Вместо использования переменных класса вы можете рассмотреть возможность использования инстансных переменных класса, поскольку они специфичны для одного класса и не проявляют неожиданного поведения, упомянутого выше.