variable objetos metodos manejo herencia ejemplos clases clase ruby oop class-method

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