クラスのすべてのインスタンスを追跡したいのですが、次のコードは完全に機能しますが、あまり DRY ではありません。
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
@@instances
は で定義され、 はおよびBaseClass
と共有されているため、これは理にかなっています。ClassA
ClassB
前の例のように動作するように、コードを後者の例のように重複排除するにはどうすればよいですか?