If you want to create a singleton, why bother creating a class? Just create an object, and add the methods and instance variables to it you want.
>> MySingleton = Object.new
=> #<Object:0x100390318>
>> MySingleton.instance_eval do
?> @count = 0
>> def next
>> @count += 1
>> end
>> end
=> nil
>> MySingleton.next
=> 1
>> MySingleton.next
=> 2
>> MySingleton.next
=> 3
A more standard way that people implement this pattern is to use a Module
as the singleton object (rather than the more generic Object
):
>> module OtherSingleton
>> @index = -1
>> @colors = %w{ red green blue }
>> def self.change
>> @colors[(@index += 1) % @colors.size]
>> end
>> end
=> nil
>> OtherSingleton.change
=> "red"
>> OtherSingleton.change
=> "green"
>> OtherSingleton.change
=> "blue"
>> OtherSingleton.change
=> "red"
If you wanted your singleton object to inherit from some class, just make it an instance of that class. To inherit from a mixin, just use #extend
. If you want a singleton object, ruby makes it really easy, and unlike other languages, it doesn't have to be defined in a class.
Ad-hoc singletons (my first example) are all over the place, and cover the majority of cases I've encountered. The module trick normally covers the rest (when I want something a little more formal).
Ruby code should (imho) use duck typing (via #respond_to?
) rather than explicitly checking an object's class, so I normally don't care about the uniqueness of my singleton objects' class, since it's not its class that makes it unique, but everything I added after.