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