2013-07-20 41 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