Class variables have a class wide scope, they can be declared anywhere in the class. A variable will be considered a class variable when prefixed with
class Dinosaur @@classification = "Like a Reptile, but like a bird" def self.classification @@classification end def classification @@classification end end dino = Dinosaur.new dino.classification # => "Like a Reptile, but like a bird" Dinosaur.classification # => "Like a Reptile, but like a bird"
Class variables are shared between related classes and can be overwritten from a child class
class TRex < Dinosaur @@classification = "Big teeth bird!" end TRex.classification # => "Big teeth bird!" Dinosaur.classification # => "Big teeth bird!"
This behaviour is unwanted most of the time and can be circumvented by using class-level instance variables.
Class variables defined inside a module will not overwrite their including classes class variables:
module SomethingStrange @@classification = "Something Strange" end class DuckDinosaur < Dinosaur include SomethingStrange end DuckDinosaur.class_variables # => [:@@classification] SomethingStrange.class_variables # => [:@@classification] DuckDinosaur.classification # => "Big teeth bird!"