class Parent @@count = 0 def self.increment @@count += 1 end def self.count @@count end end class Child < Parent def self.increment @@count += 2 end end Parent.increment Child.increment puts Parent.count
The class variable @@count is shared between Parent and Child classes. Parent.increment adds 1, then Child.increment adds 2, so total is 3.
class A @@var = 'A' def self.var @@var end end class B < A @@var = 'B' end puts A.var
Assigning @@var = 'B' in subclass B changes the shared class variable for both classes. So A.var returns 'B'.
class Parent @@data = [] def self.add(item) @@data << item end def self.data @@data end end class Child < Parent end Parent.add('parent1') Child.add('child1') puts Parent.data.inspect puts Child.data.inspect
Class variable @@data is shared between Parent and Child. Adding items from either class modifies the same array, so both show all added items.
Using @@var to hold mutable data shared by subclasses can cause bugs because changes in one subclass affect others unexpectedly.
Class variables (@@) are shared by a class and all its subclasses, so changes in one place affect all others, leading to hard-to-track bugs.
