GGistDev

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 << self accessors
  • Use class variables only when a shared value across subclasses is intentional