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?
You can create an array by separating values by commas and enclosing your list with square brackets. In Ruby, arrays always keep their order unless you do something to change the order. They are zero-based, so the array index starts at 0.
What is a class in Ruby? Classes are the basic building blocks in Object-Oriented Programming (OOP) & they help you define a blueprint for creating objects. Objects are the products of the class.
What is the difference between a class and a module? Modules are collections of methods and constants. They cannot generate instances. Classes may generate instances (objects), and have per-instance state (instance variables).
Ruby uses the super keyword to call the superclass implementation of the current method. Within the body of a method, calls to super acts just like a call to that original method. The search for a method body starts in the superclass of the object that was found to contain the original method.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With