2014-12-03 51 views
0

类的实例是否为其设置索引?如果是这样,是否有可能迭代它们很像数组,以压缩我使用的代码行数量?目前,我的程序有超过100个类的实例,我想写一个循环,所以代码基本上不是一个庞大的“Class#new's”列表!这种做法有悖于使课堂本身成为首要目标(不是真的,但你明白了)。Ruby - 遍历实例

+6

我不明白 - 你可以分享一些代码来描述你在做什么,而你希望发生什么? – sameers 2014-12-03 06:02:49

+2

“但你明白了” - 唔......不,我不知道。 – 2014-12-03 11:26:00

回答

3

您可以使用ObjectSpace检索给定类的所有实例化对象: 比方说您有一个类名为MyClass,你想那个类的所有实例,然后

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

这是怎么过的一个坏想法做到这一点。它也将加载MyClass实例,该实例仍然来自先前未被垃圾收集的请求的内存。

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

+0

您可以首先运行'GC.start'来删除剩余的局部变量(例如,在没有GC的spec文件中它不适用于我) - 在ObjectSpace之前写入'puts'以打印对象的计数。 – bimlas 2016-09-06 08:05:53

1

Aside 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>]