Как получить экземпляры классов в Ruby?

Скажем, у меня есть класс Post с множеством инициированных экземпляров (т.е. Post.new(:name => 'foo')).

Есть ли способ получить все экземпляры этого класса, вызвав что-то для него? Я ищу что-то вроде Post.instances.all

Идеи?

Спасибо!

3 ответа

Решение

Иллюстрируя ответы как 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

Вы можете использовать ObjectSpace для извлечения всех экземпляров объектов данного класса:

posts = []
ObjectSpace.each_object Post do |post|
  posts << post
end

Это почти наверняка плохая идея - например, он также будет загружать экземпляры Post, которые все еще находятся в памяти из предыдущих запросов, которые не были собраны сборщиком мусора. Вероятно, есть гораздо лучший способ получить доступ к сообщениям, которые вас интересуют, но нам потребуется больше информации о том, что вы пытаетесь сделать.

Переопределить новый; вести счет; выставить собственность.

Другие вопросы по тегам