Ruby Language Variables d'instance


Exemple

Les variables d'instance ont une portée étendue à l'objet, elles peuvent être déclarées n'importe où dans l'objet, cependant une variable d'instance déclarée au niveau de la classe ne sera visible que dans l'objet de classe. Une variable sera considérée comme une variable d'instance avec le préfixe @ . Les variables d’instance permettent de définir et d’obtenir des attributs d’objet et renvoient zéro si elles ne sont pas définies.

class Dinosaur
    @base_sound = "rawrr"

    def initialize(sound = nil)
        @sound = sound || self.class.base_sound
    end

    def speak
        @sound
    end

    def try_to_speak
        @base_sound
    end

    def count_and_store_sound_length
        @sound.chars.each_with_index do |char, i|
            @sound_length = i + 1
            p "#{char}: #{sound_length}"
        end
    end
    
    def sound_length
        @sound_length
    end

    def self.base_sound
        @base_sound
    end
end

dino_1 = Dinosaur.new
dino_2 = Dinosaur.new "grrr"

Dinosaur.base_sound
# => "rawrr"
dino_2.speak
# => "grrr"

La variable d'instance déclarée au niveau de la classe n'est pas accessible au niveau de l'objet:

dino_1.try_to_speak
# => nil

Cependant, nous avons utilisé la variable d’instance @base_sound pour instancier le son quand aucun son n’est transmis à la nouvelle méthode:

dino_1.speak
# => "rawwr"

Les variables d'instance peuvent être déclarées n'importe où dans l'objet, même à l'intérieur d'un bloc:

dino_1.count_and_store_sound_length
# "r: 1"
# "a: 2"
# "w: 3"
# "r: 4"
# "r: 5"
# => ["r", "a", "w", "r", "r"]

dino_1.sound_length
# => 5

Les variables d'instance ne sont pas partagées entre les instances de la même classe

dino_2.sound_length
# => nil

Cela peut être utilisé pour créer des variables de niveau classe, qui ne seront pas écrasées par une classe enfant, car les classes sont également des objets dans Ruby.

class DuckDuckDinosaur < Dinosaur
    @base_sound = "quack quack"
end

duck_dino = DuckDuckDinosaur.new
duck_dino.speak
# => "quack quack"
DuckDuckDinosaur.base_sound
# => "quack quack"
Dinosaur.base_sound
# => "rawrr"