2014-12-03 53 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>]