为每个 child class 创建 parent 的 class 变量的新实例
Create a new instance of parent's class variable for each child class
我有这个 parent class:
class ListBase
@@list = []
def self.list
@@list
end
end
我正在尝试创建两个 child class,如下所示:
class Child1 < ListBase
end
class Child2 < ListBase
end
我的印象是这些 child class 中的每一个都有自己的 @@list
class 变量。但是,我明白了:
Child1.list.push(1)
Child2.list.push(2)
Child1.list # => [1, 2]
Child2.list # => [1, 2]
这意味着 child classes 从 parent class.
共享 @@list
如何在不重复的情况下为每个 child class 创建一个单独的 class 变量?
您正在通过 class 方法 (getter/reader) 使用 class 变量。
因此,您可以在派生 classes 中覆盖该方法,并为每个派生 class.
使用自己的 class 变量
不好玩,但是 class 变量是如何工作的,它们在 class 和派生的 class 中共享。
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]
正如@CarySwoveland 评论的那样,在您的用例中,您应该使用 class 实例变量:
class ListBase
@list = []
def self.list
@list
end
end
甚至不确定您为什么要为您的用例使用 class 变量。
我有这个 parent class:
class ListBase
@@list = []
def self.list
@@list
end
end
我正在尝试创建两个 child class,如下所示:
class Child1 < ListBase
end
class Child2 < ListBase
end
我的印象是这些 child class 中的每一个都有自己的 @@list
class 变量。但是,我明白了:
Child1.list.push(1)
Child2.list.push(2)
Child1.list # => [1, 2]
Child2.list # => [1, 2]
这意味着 child classes 从 parent class.
共享@@list
如何在不重复的情况下为每个 child class 创建一个单独的 class 变量?
您正在通过 class 方法 (getter/reader) 使用 class 变量。
因此,您可以在派生 classes 中覆盖该方法,并为每个派生 class.
使用自己的 class 变量
不好玩,但是 class 变量是如何工作的,它们在 class 和派生的 class 中共享。
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]
正如@CarySwoveland 评论的那样,在您的用例中,您应该使用 class 实例变量:
class ListBase
@list = []
def self.list
@list
end
end
甚至不确定您为什么要为您的用例使用 class 变量。