我有类似以下的内容
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”值?
答案 0 :(得分:4)
快速回答,因为如果您真正理解了类,继承和对象:将@var
(一个实例变量,a
和b
中的不同变体)替换为@@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