Как найти каждый экземпляр класса в 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>]