Как найти каждый экземпляр класса в Ruby
Есть ли способ получить все объекты, относящиеся к определенному классу в Ruby?
Чтобы уточнить:
class Pokemon
end
pikatchu = Pokemon.new
charmander = Pokemon.new
Итак, можно ли каким-то образом получить ссылки на эти два объекта (pikatchu
и charmander
)?
Я действительно думал о том, чтобы перетащить все это в массив классов с помощью инициализации, но это потенциально может стать большим, и я предполагаю, что к нему может быть применен собственный подход Ruby.
Ответы
Ответ 1
Решение состоит в использовании метода ObjectSpace.each_object
типа
ObjectSpace.each_object(Pokemon) {|x| p x}
который производит
<Pokemon:0x0000010098aa70>
<Pokemon:0x00000100992158>
=> 2
Подробности обсуждаются в книге PickAxe Глава 25
Ответ 2
Да, можно использовать ObjectSpace
, но на практике можно просто отслеживать экземпляры по мере их создания.
class Pokemon
@pokees = []
self.class.public_send(:attr_reader, :pokees)
def initialize
self.class.pokees << self
end
end
pikatchu = Pokemon.new
#=> #<Pokemon:0x00005c46da66d640>
charmander = Pokemon.new
#=> #<Pokemon:0x00005c46da4cc7f0>
Pokemon.pokees
#=> [#<Pokemon:0x00005c46da66d640>, #<Pokemon:0x00005c46da4cc7f0>]