2010-12-13 122 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 

輸出:實例變量

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

我的問題是,訪問testmethod()在子類TestExtension結果在訪問這是在TestExtension類被聲明的@var是價值,而不是訪問值正在申報Test班。這是對的嗎 ?

+1

格式化你的代碼(通過把4個空格周圍的所有標識的所有代碼行和反引號前將英文文本)。閱讀此信息以獲取更多信息:http://stackoverflow.com/editing-help – Jakob 2010-12-13 07:55:50

回答

3

簡短的回答:

稍長的答案:
實例變量,顧名思義,每實例。對於每個對象,只能有一個名爲@var的變量,而不管哪個類具有訪問它的代碼。

+0

安靜有幫助。謝謝 :) – 2010-12-27 12:19:33

0

正確。如Gareth所說,實例變量屬於實例而不屬於類。

如果你想讓變量屬於類,你可以使用類對象的實例變量(err,這個術語要複雜才能正確寫入)。

簡而言之,Ruby中的所有東西都是一個對象,包括類。在下面的例子中,Base和Derivative只是包含對象的引用的常量。這些對象表示類(ta-da!)。

考慮這個事實考慮在內,我們可以做到以下幾點:

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