如何列出从在Ruby类中创建的所有对象? [重复](How do I list all obje

2019-07-18 04:52发布

这个问题已经在这里有一个答案:

  • 如何找到在Ruby中一个类的每个实例 1个回答

是否有红宝石任何一类,以了解有多少它的实例存在,它可以列出他们呢?

下面是一个示例类:

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.allProject.count返回的列表和当前项目的计数。

我该怎么做呢?

Answer 1:

您可以使用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


Answer 2:

其中一个办法就是保持它的轨道,当你创建新实例。

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


Answer 3:

class Project
    def self.all; ObjectSpace.each_object(self).to_a end
    def self.count; all.length end
end


Answer 4:

也许这将工作:

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

但是,你必须手动销毁这些对象。 也许其他的解决方案可以根据对象空间模块上生成。



文章来源: How do I list all objects created from a class in Ruby? [duplicate]