类的实例是否为它们设置索引?如果是这样的话,是否有可能像数组一样迭代它们以压缩我使用的代码行数?目前,我的程序有超过100个类的实例,我想编写一个循环,所以代码基本上只是一个庞大的#class; new#'s!它有点打败了最初使课堂本身的目的(不是真的,但你明白了)。
答案 0 :(得分:3)
您可以使用ObjectSpace检索给定类的所有实例化对象:
假设你有一个名为MyClass
的类,你想要那个类的所有实例
ObjectSpace.each_object(MyClass) do |obj|
#do what ever you want to do with that object
end
如何做到这一点是个坏主意。它还将从尚未进行垃圾回收的早期请求中加载仍在内存中的MyClass
个实例。
attr_reader
应设置为直接访问obj(类变量)。也可以定义访问它们的方法。
答案 1 :(得分:1)
除了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>]