2010-12-13 19 views
2
class Test 
    def initialize 
    @var = "125" 
    end 
    def testmethod 
    puts @var 
    puts "accessing me from child class" 
    end 
end 

class TestExtension < Test 

    def method1 
    puts @var = "One Hundred and twenty five" 
    testmethod() 
    end 
end 

t = Test.new 
p = TestExtension.new 
p.method1 
t.testmethod 

sortie:Variable d'instance en rubis

One Hundred and twenty five 
One Hundred and twenty five 
accessing me from child class 
125 
accessing me from child class 

Ma question est que l'accès à la testmethod() en classe enfant TestExtension résultats pour accéder à cette valeur de @var qui est déclaré dans TestExtension classe au lieu d'accéder à la valeur est déclaré dans la classe Test. Est-ce correct ?

+1

Formaté votre code (en mettant 4 places avant toutes les lignes de code et des backticks autour de tous les identifiants dans votre texte anglais). Lisez ceci pour plus d'informations: http://stackoverflow.com/editing-help – Jakob

Répondre

3

Réponse courte:
Oui

Légèrement plus réponse:
Les variables d'instance sont, comme leur nom l'indique, par exemple . Pour chaque objet, il ne peut y avoir qu'une seule variable appelée @var, quelle que soit la classe ayant le code pour y accéder.

+0

Calme utile. Merci :) –

0

Il est correct. Comme Gareth l'a dit, les variables d'instance appartiennent à des instances, pas à des classes.

Si vous souhaitez que les variables appartiennent à des classes, vous pouvez utiliser la variable d'instance de l'objet de classe (err, ce terme est complexe pour l'écrire correctement).

En bref, tout dans Ruby est un objet, y compris les classes. Dans l'exemple suivant, Base et Dérivée sont juste des constantes qui contiennent une référence aux objets. Ces objets représentent des classes (ta-da!).

Prenant en compte ce fait, nous pouvons faire ce qui suit:

class Base 
    @var = 1 

    def self.change(new_value) 
    @var = new_value 
    end 

    def self.to_s 
    "#{self.name}, @var = #{@var}" 
    end 
end 

class Derivative < Base; end 

Derivative.change(2) 

puts Base   # => Base, @var = 1 
puts Derivative # => Derivative, @var = 2