在Ruby中抽象/泛化类层次结构变量

在Ruby中抽象/泛化类层次结构变量,ruby,Ruby,我有几个类,我希望每个类都在类级别上维护为将来查找而创建的所有实例的哈希。类似于: 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,我希望所有这些都有这个功能 我可以

我有几个类,我希望每个类都在类级别上维护为将来查找而创建的所有实例的哈希。类似于:

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,我希望所有这些都有这个功能


我可以让它们都从一个超类继承吗?这个超类有一个通用版本,它们可以利用这个超类,这样我就不必为每个类重新实现很多东西了。

是的,您可以从同一个超类继承,也可以使用模块和
包括

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
A类
def初始化(id)
self.class.index(id,self)
结束
def self.index id,实例
@所有| |={}
@all[id]=实例
结束
def自我查找(id)
@全部[id]
结束
结束
B类 #
p.B.find(2)
#=> #
p.C.find(3)
#=> #
p.A.find(2)
#=>零

如果您试图跟踪作用域,那么您不需要散列来存储self,您可以使用祖先方法,也可以直接使用object.classIt似乎我仍然需要在每个类中添加内容。是否有一种方法可以定义M中的所有内容-散列实例和查找函数(以及所有函数),这样我就可以执行a.all并获取所有a实例,B.find(id)并获取具有给定id的B实例,等等。在每个类中,您只需在构造函数中调用
super
。不确定这是否是你的交易破坏者。请参阅最新的编辑btw。