是否有红宝石任何一类,以了解有多少它的实例存在,它可以列出他们呢?
下面是一个示例类:
class Project
attr_accessor :name, :tasks
def initialize(options)
@name = options[:name]
@tasks = options[:tasks]
end
def self.all
# return listing of project objects
end
def self.count
# return a count of existing projects
end
end
现在,我创建这个类的项目对象:
options1 = {
name: 'Building house',
priority: 2,
tasks: []
}
options2 = {
name: 'Getting a loan from the Bank',
priority: 3,
tasks: []
}
@project1 = Project.new(options1)
@project2 = Project.new(options2)
我想是有类方法,如Project.all
和Project.count
返回的列表和当前项目的计数。
我该怎么做呢?
您可以使用ObjectSpace
模块要做到这一点,特别是each_object
方法。
ObjectSpace.each_object(Project).count
为了完整起见,这里是你将如何使用,在你的类(帽尖泽)
class Project
# ...
def self.all
ObjectSpace.each_object(self).to_a
end
def self.count
all.count
end
end
其中一个办法就是保持它的轨道,当你创建新实例。
class Project
@@count = 0
@@instances = []
def initialize(options)
@@count += 1
@@instances << self
end
def self.all
@@instances.inspect
end
def self.count
@@count
end
end
如果你想使用ObjectSpace
,那么它的
def self.count
ObjectSpace.each_object(self).count
end
def self.all
ObjectSpace.each_object(self).to_a
end
class Project
def self.all; ObjectSpace.each_object(self).to_a end
def self.count; all.length end
end
也许这将工作:
class Project
class << self; attr_accessor :instances; end
attr_accessor :name, :tasks
def initialize(options)
@name = options[:name]
@tasks = options[:tasks]
self.class.instances ||= Array.new
self.class.instances << self
end
def self.all
# return listing of project objects
instances ? instances.dup : []
end
def self.count
# return a count of existing projects
instances ? instances.count : 0
end
def destroy
self.class.instances.delete(self)
end
end
但是,你必须手动销毁这些对象。 也许其他的解决方案可以根据对象空间模块上生成。