Ruby Language Variables de classe


Exemple

Les variables de classe ont une portée étendue, elles peuvent être déclarées n'importe où dans la classe. Une variable sera considérée comme une variable de classe avec le préfixe @@

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"

Les variables de classe sont partagées entre les classes associées et peuvent être écrasées à partir d'une classe enfant

class TRex < Dinosaur
    @@classification = "Big teeth bird!"
end

TRex.classification
# => "Big teeth bird!"

Dinosaur.classification
# => "Big teeth bird!"

Ce comportement est indésirable la plupart du temps et peut être contourné en utilisant des variables d'instance de niveau classe.

Les variables de classe définies dans un module n'écrasent pas leurs variables de classe incluant les classes:

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!"