Вы правильно поняли, хотя есть некоторые
морщины. Переменные класса (@@ foo) могут быть доступны как из методов класса, так и из методов экземпляра класса.
Они ведут себя несколько не интуитивно в отношении наследования: если вы установите такую переменную в базовом классе и установите ее снова в подклассе, то вы измените значение для всех классов в иерархии. Если вы используете переменные класса для хранения настроек, это часто не то, что вам нужно - вы хотите, чтобы подклассы могли «переопределять» значения из базового класса, фактически не изменяя их для базового класса. Rails предоставляет class_attribute
для этого: он создает методы доступа, которые имеют такое поведение.
Наконец, не совсем отдельный тип, но поскольку классы являются объектами, существуют также переменные экземпляра класса. Они ничего не делают в отношении наследования - каждый объект класса в иерархии имеет свои полностью независимые объекты. В отличие от переменных класса, экземпляры не могут напрямую манипулировать переменными экземпляра класса.