我有几个类,我希望每个类在类级别上维护为将来查找而创建的所有实例的哈希。类似于:
class A
def initialize(id, otherstuff)
# object creation logic
@@my_hash[id]=self
end
def self.find(id)
@@my_hash[id]
end
end
所以我可以A.find(id)
然后返回正确的实例。
这些类中有几个(A,B等),都有id,所有这些我想拥有这个功能。
我可以让他们都从一个超类中继承,这个超类有一个他们可以利用的通用版本,所以我不需要为每个类重新实现很多东西吗?
答案 0 :(得分:0)
是的,您既可以从同一个超类继承,也可以使用模块和include
:
module M
def initialize(id)
@@all ||= {}
@@all[id] = self
end
def print
p @@all
end
end
class C
include M
def initialize(id)
super
puts "C instantiated"
end
end
如果要为每个子类保留单独的索引,可以执行以下操作:
def initialize(id)
@@all ||= {}
@@all[self.class] ||= {}
@@all[self.class][id] = self
end
编辑:发表评论后,我发现你需要保留每类索引。所以:
class A
def initialize(id)
self.class.index(id, self)
end
def self.index id, instance
@all ||= {}
@all[id] = instance
end
def self.find(id)
@all[id]
end
end
class B < A
end
class C < A
end
a = A.new(1)
b = B.new(2)
c = C.new(3)
p A.find(1)
#=> #<A:0x10016c190>
p B.find(2)
#=> #<B:0x10016c140>
p C.find(3)
#=> #<C:0x10016c118>
p A.find(2)
#=> nil