我有这个家长班:
class ListBase
@@list = []
def self.list
@@list
end
end
我正在尝试创建两个子类,如下所示:
class Child1 < ListBase
end
class Child2 < ListBase
end
给我的印象是,这些子类中的每个子类都有自己的@@list
类变量。但是,我得到了:
Child1.list.push(1)
Child2.list.push(2)
Child1.list # => [1, 2]
Child2.list # => [1, 2]
这意味着子类与父类共享@@list
。
如何为每个子类创建一个单独的类变量而无需重复?
答案 0 :(得分:1)
您正在通过类方法(获取器/读取器)使用类变量。
因此,您可以在派生类中重写该方法,并为每个派生类使用自己的类变量。
不好玩,但是类变量是如何工作的,它们在一个类和派生类中也是共享的。
class ListBase
def self.list
@@base_list ||= []
end
end
class ListOne
def self.list
@@one_list ||= []
end
end
class ListTwo
def self.list
@@two_list ||= []
end
end
ListOne.list << 1
ListTwo.list << 2
puts ListOne.list
# => [1]
puts ListTwo.list
# => [2]
答案 1 :(得分:1)
作为@CarySwoveland注释,在您的用例中,您应该使用类实例变量:
class ListBase
@list = []
def self.list
@list
end
end
甚至不确定为什么要考虑在用例中使用类变量。