Как получить экземпляры классов в 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
Заменить новое; держать счет; выставлять имущество.