0

我有这个父类:

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父类的。

如何为每个子类创建一个单独的类变量而不重复?

4

2 回答 2

1

正如@CarySwoveland 评论,在您的用例中,您应该使用一个类实例变量:

class ListBase
  @list = []

  def self.list
    @list
  end
end

甚至不知道为什么你想为你的用例使用一个类变量。

于 2018-11-09T08:29:42.503 回答
1

您正在通过类方法(getter/reader)使用类变量。
因此,您可以在派生类中覆盖该方法,并为每个派生类使用自己的类变量。
不好玩,但类变量是如何工作的,它们在类和派生类中共享。

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]
于 2018-11-09T06:21:50.243 回答