Ruby-读取另一个类中变量的值?

时间:2010-11-16 12:55:53

标签: ruby inheritance

我有类似以下的内容

class A 

  def initialize
    @var = 0
  end

  def dosomething
      @var+=1
  end

end

class B < A

 def initialize
   super
 end
 def func
    puts @var
 end
end

问题在于我打电话

 a = A.new
 a.dosomething
 b = B.new

@var返回的值是0我如何更改代码,以便返回var(1)的“new”值?

5 个答案:

答案 0 :(得分:4)

快速回答,因为如果您真正理解了类,继承和对象:将@var(一个实例变量,ab中的不同变体)替换为@@var (一个类变量,因此在class A)的所有实例中都是相同的。

否则,您的问题表明您对类,对象和继承的情况存在根本性的误解。

您的代码执行以下操作:

  • 定义一个名为A的类。这本质上是一个可以创建对象的蓝图。
    • 声明当创建类型为A的对象时,应该为该对象提供一个名为var的属性的私有副本,该副本设置为0
    • 声明可以向A询问dosomething类型的对象,这会将该对象的var的值增加1。
  • 定义一个名为B的类,这是A的特殊情况

因此,在第二个代码段中,您创建了一个a对象A。它有自己的属性var,它被设置为0然后递增。然后,您创建b,这是B(因此也是A)。 b自己的属性var a的{​​{1}}分开,设置为0

答案 1 :(得分:2)

@var之类的变量称为实例变量,因为它们对于类的每个实例都是唯一的。您已经创建了两个单独的实例a和b,它们有自己的实例变量。

如果要在子类中查看它们,可以使用类变量

class A  
  @@var = 0 
  def dosomething 
    @@var += 1 
  end 
end 

class B < A 
 def func 
    puts @@var 
 end 
end 

您还可以使用类级访问器方法:

class A  
  class << self
    attr_accessor :var
    def dosomething(n) 
      self.var = n 
    end
  end 
end 

class B < A 
 def func 
    puts A.var 
 end 
end 

irb(main):031:0> A.dosomething(5)
=> 5
irb(main):032:0> b = B.new
=> #<B:0x2b349d>
irb(main):033:0> b.func
5

请注意,这不需要继承。

答案 2 :(得分:1)

@var实例变量,此类的每个实例都有自己的此变量值。所以b确实返回0是正确的,因为与a相比它是一个不同的实例。

更新b中的值:

b = B.new
b.dosomething

Here是有关实例变量的更多信息。

如果你想要一个类变量(即一个变量在该类的所有实例中相同),请使用{{ 1}}。然后你的例子就可以了。

Here是关于类变量的更多信息。

您需要哪种解决方案取决于您的应用程序。

答案 3 :(得分:1)

您可以使用类变量:

class A 
  @@var = 0
  def dosomething
    @@var += 1
  end
end

class B < A
 def func
    puts @@var
 end
end

a = A.new
a.dosomething
a.dosomething
b = B.new
b.func # => 2

答案 4 :(得分:0)

您需要使用类变量,而不是实例变量。尝试这样的事情:

class A

  @@var = 0

  def dosomething
      @@var+=1
  end
end

class B < A

 def func
    puts @@var
 end
end