In Ruby, when you declare a "class variable" (i.e. @@variable
) it creates a static variable, where:
- Only one copy of this variable exists across all instances of the class, and;
- This variable is shared between the class and all its subclasses.
You should use class variables with caution as all subclasses inherit the same class variables from its superclass, which can lead to unexpected/confusing results.
For example, consider the following class where a static counter
is incremented each time a new object is instantiated:
class Entity
@@counter = 0
def initialize
@@counter += 1
end
def counter
@@counter
end
end
a = Entity.new
b = Entity.new
c = Entity.new
puts a.counter #=> 3
puts b.counter #=> 3
puts c.counter #=> 3
As you can see from the example above, all instances of the class return the same value from counter()
method, because @@counter
is a class variable that's shared across all instances of the Entity
class.
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.