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

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

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

Идеи?

Спасибо!

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Заменить новое; держать счет; выставлять имущество.