Class Variables in Ruby
@@var is shared across a class hierarchy; prefer class instance variables instead.
Basics
Class variables are visible to a class and its subclasses; changes in one affect all.
class Base
@@count = 0
def self.bump; @@count += 1 end
def self.count; @@count end
end
class Child < Base; end
Base.bump; Child.bump
Base.count # => 2
Child.count # => 2
Pitfalls with inheritance
Subclassing can lead to surprising coupling when multiple branches share @@var.
class A; @@x = 1; end
class B < A; end
class C < A; end
B.class_eval { @@x = 2 }
# Now C sees 2 as well — shared across the tree
Prefer class instance variables
Use @var on the class object for clearer, per‑class state.
class Counter
@count = 0 # class instance variable (belongs to Counter only)
class << self
attr_accessor :count
end
end
class Special < Counter; end
Counter.count = 1
Special.count # => nil (separate storage)
When to use class variables
Rarely: when you truly need one value shared across a hierarchy and you understand the coupling.
Summary
@@is shared across the hierarchy and can surprise during inheritance- Prefer class instance variables with
class << selfaccessors - Use class variables only when a shared value across subclasses is intentional