2013-07-20 60 views
0

我要跟蹤類的所有實例,下面的代碼工作完美,但不是很乾。其中紅寶石重複數據刪除和跟蹤情況

class BaseClass 
end 

class ClassA < BaseClass 
    @@instances = [] 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    @@instances << self 
    end 
    def self.list 
    @@instances 
    end 
    def to_s 
    @name 
    end 
end 

class ClassB < BaseClass 
    @@instances = [] 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    @@instances << self 
    end 
    def self.list 
    @@instances 
    end 
    def to_s 
    @name 
    end 
end 

puts "Creating instances" 
a = ClassA.new "a" 
aa = ClassA.new "aa" 
b = ClassB.new "b" 

puts "Listing for ClassA" 
puts ClassA.list 
puts "Listing for ClassB" 
puts ClassB.list 

輸出成爲

Creating instances 
Listing for ClassA 
a 
aa 
Listing for ClassB 
b 

完善。然而,當我試圖重複數據刪除它像這樣

class BaseClass 
    @@instances = [] 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    @@instances << self 
    end 
    def self.list 
    @@instances 
    end 
    def to_s 
    @name 
    end 
end 

class ClassA < BaseClass 
end 

class ClassB < BaseClass 
end 

puts "Creating instances" 
a = ClassA.new "a" 
aa = ClassA.new "aa" 
b = ClassB.new "b" 

puts "Listing for ClassA" 
puts ClassA.list 
puts "Listing for ClassB" 
puts ClassB.list 

我得到以下輸出

Creating instances 
Listing for ClassA 
a 
aa 
b 
Listing for ClassB 
a 
aa 
b 

這使得因爲@@instancesBaseClass定義,並與ClassAClassB共享感。

我怎樣才能讓我的代碼重複數據刪除看起來像後者的例子,使得它像前者的例子嗎?

回答

0

最簡單的方法是擺脫你正在嘗試做的伎倆,並使用ObjectSpace.each_object

class BaseClass 
    attr_accessor :name 
    def initialize(name); @name = name end 
    def to_s; @name end 
end 

class ClassA < BaseClass; end 

class ClassB < BaseClass; end 

puts "Creating instances" 
a = ClassA.new "a" 
aa = ClassA.new "aa" 
b = ClassB.new "b" 
puts "Listing for ClassA" 
puts ObjectSpace.each_object(ClassA).to_a 
puts "Listing for ClassB" 
puts ObjectSpace.each_object(ClassB).to_a 

這給

Creating instances 
Listing for ClassA 
aa 
a 
Listing for ClassB 
b 
+0

完美。爲了完整性,我更新了列表函數以定義self.list; ObjectSpace.each_object(Object.const_get(名稱))。to_a結束 – zeroXten