Как получить экземпляры классов в 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, которые все еще находятся в памяти из предыдущих запросов, которые не были собраны сборщиком мусора. Вероятно, есть гораздо лучший способ получить доступ к сообщениям, которые вас интересуют, но нам потребуется больше информации о том, что вы пытаетесь сделать.