Ruby - 迭代实例

时间:2014-12-03 05:48:29

标签: ruby class methods iteration

类的实例是否为它们设置索引?如果是这样的话,是否有可能像数组一样迭代它们以压缩我使用的代码行数?目前,我的程序有超过100个类的实例,我想编写一个循环,所以代码基本上只是一个庞大的#class; new#'s!它有点打败了最初使课堂本身的目的(不是真的,但你明白了)。

2 个答案:

答案 0 :(得分:3)

您可以使用ObjectSpace检索给定类的所有实例化对象:   假设你有一个名为MyClass的类,你想要那个类的所有实例

ObjectSpace.each_object(MyClass) do |obj|
  #do what ever you want to do with that object
end

如何做到这一点是个坏主意。它还将从尚未进行垃圾回收的早期请求中加载仍在内存中的MyClass个实例。

attr_reader应设置为直接访问obj(类变量)。也可以定义访问它们的方法。

答案 1 :(得分:1)

除了Qaisar Nadeem's answer using ObjectSpace,您可以使用变量来存储给定类的实例。您可以使用类变量:

class B
  @@instances = []
  def initialize
    @@instances << self
  end
  def self.instances
    @@instances
  end
end

B.new
# => #<B:0x3f54408>
B.new
# => #<B:0x3efbb90>
B.instances
# => [#<B:0x3f54408>, #<B:0x3efbb90>]

但是,继承的类使用相同的类变量(可能是您想要的也可能不是):

class C < B
end
C.new
# => #<C:0x39900a8>
B.instances
# => [#<B:0x3f54408>, #<B:0x3efbb90>, #<C:0x39900a8>] 

您可以使用类'实例变量(与对象的实例变量不同!):

class AA
  @instances = []
  def self.push_instance instance
    @instances << instance
  end
  def initialize
    self.class.push_instance self
  end
  def self.instances
    @instances
  end
end

AA.new
# => #<AA:0x41ba0e8>
AA.instances
# => [#<AA:0x41ba0e8>]
AA.new
# => #<AA:0x29f8638>
AA.instances
# => [#<AA:0x41ba0e8>, #<AA:0x29f8638>]

class BB < AA
  @instances = []
end

AA.instances
=> [#<AA:0x41ba0e8>, #<AA:0x29f8638>]
BB.new
=> #<BB:0x3fe8e48>
BB.new
=> #<BB:0x3fa4bf8>
BB.new
=> #<BB:0x3f43e18>
BB.instances
=> [#<BB:0x3fe8e48>, #<BB:0x3fa4bf8>, #<BB:0x3f43e18>]
AA.instances
=> [#<AA:0x41ba0e8>, #<AA:0x29f8638>]