如何在Ruby中获取类实例?

13

假设我有一个名为Post的类并初始化了多个实例(例如Post.new(:name => 'foo'))。

是否有一种方法可以通过调用该类的某些东西来检索该类的所有实例? 我正在寻找类似于Post.instances.all这样的东西


1
你可能可以手动存储一个引用列表,然后从构造函数中更新...但我很好奇为什么你需要这样做? - Locksfree
3个回答

24
你可以使用 ObjectSpace 来检索给定类的所有已实例化对象:
posts = []
ObjectSpace.each_object Post do |post|
  posts << post
end
这几乎肯定是一个不好的想法,因为它也会加载之前请求中仍在内存中且尚未进行垃圾回收的Post实例。有可能存在更好的方式来获取您关心的文章,但我们需要更多关于您正在尝试做什么的信息。

20

展示alphazero和PreciousBodilyFluids两个答案的方法:

class Foo
  @@instance_collector = []
  def initialize
    @@instance_collector << self
    #other stuff
  end
  def self.all_offspring
    @@instance_collector
  end
end

a = Foo.new
b = Foo.new

p Foo.all_offspring  # => [#<Foo:0x886d67c>, #<Foo:0x886d668>]
p ObjectSpace.each_object(Foo).to_a # => [#<Foo:0x886d668>, #<Foo:0x886d67c>] #order is different

如果一个实例被销毁了,这个 @@instance_collector 会被更新吗? - Vijay
@Vijay的简短回答是否定的,因为没有LOC将对象从数组中移除。 - onebree

7
重写 new;保留计数;公开属性。

+1 简短、简洁、直接。 - Kyle Sletten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接