How do I list all objects created from a class in Ruby? [duplicate]

*爱你&永不变心* 提交于 2019-12-17 22:36:08

问题


Is there any way in Ruby for a class to know how many instances of it exist and can it list them?

Here is a sample class:

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

Now I create project objects of this class:

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)

What I would like is to have class methods like Project.all and Project.count to return a listing and count of current projects.

How do I do this?


回答1:


You can use the ObjectSpace module to do this, specifically the each_object method.

ObjectSpace.each_object(Project).count

For completeness, here's how you would use that in your class (hat tip to sawa)

class Project
  # ...

  def self.all
    ObjectSpace.each_object(self).to_a
  end

  def self.count
    all.count
  end
end



回答2:


One way to do is to keep track of it as and when you create new instances.

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

If you want to use ObjectSpace, then its

def self.count
    ObjectSpace.each_object(self).count
end

def self.all
    ObjectSpace.each_object(self).to_a
end



回答3:


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



回答4:


Maybe this will work:

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

But you will have to manually destroy these objects. Maybe other solution can be build based on ObjectSpace module.



来源:https://stackoverflow.com/questions/14318079/how-do-i-list-all-objects-created-from-a-class-in-ruby

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!