metodos - ¿Cómo enumero todos los objetos creados a partir de una clase en Ruby?
variable de clase en ruby (4)
Esta pregunta ya tiene una respuesta aquí:
¿Hay alguna forma en Ruby para que una clase sepa cuántas instancias existen y puede enumerarlas?
Aquí hay una muestra de clase:
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
Ahora creo objetos de proyecto de esta clase:
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)
Lo que me gustaría es tener métodos de clase como Project.all
y Project.count
para devolver un listado y contar los proyectos actuales.
¿Cómo hago esto?
Puede usar el módulo ObjectSpace
para hacer esto, específicamente el método each_object
.
ObjectSpace.each_object(Project).count
Para completar, aquí es cómo usarías eso en tu clase (punta de sombrero para sawa)
class Project
# ...
def self.all
ObjectSpace.each_object(self).to_a
end
def self.count
all.count
end
end
Tal vez esto funcione:
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
Pero tendrás que destruir manualmente estos objetos. Quizás se pueda construir otra solución basada en el módulo ObjectSpace.
Una forma de hacerlo es realizar un seguimiento del mismo cuando creas nuevas instancias.
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
Si desea utilizar ObjectSpace
, entonces su
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