In Ruby, there’s the concept of eigenclasses, or singleton classes. These are classes implicitly defined when attaching methods to a single instance.
Ruby is object-oriented: every data type is an object, including classes and types which many other languages designate as primitives (such as integers, booleans, and “nil”). Every function is a method. Named values (variables) always designate references to objects, not the objects themselves. Ruby supports inheritance with dynamic dispatch, mixins and singleton methods (belonging to, and defined for, a single instance rather than being defined on the class).
Here I present an example I hope will make it simple to understand. We know
martial artists can fight, right? And we know Jackie Chan can play while
fighting, right? Now suppose there’s no Sammo Hung and Jackie Chan is the only
one who do fancy things while fighting. All other martial artists are Bruce
Lee-like. What do we do? Extend
MartialArtist class to create
FunnyMartialArtist class which will get instantiated only once? Instead, we
can just add a method
jackie_chan object which is an
MartialArtist. This way:
Now we can call
jackie_chan.do_funny_fighting, but not
bruce_lee.do_funny_fighting. This is a singleton method.
How does this work? Under the hood, there’s a pointer in
jackie_chan to the
MartialArtist class. If Ruby modifies its content to add the new method, it
will also affects
bruce_lee object. So, Ruby creates a new class, adds the
method to it and updates
jackie_chan class pointer to point to this new class
(and this class points to previous
MartialArtist class). This new class is an
That’s a simple way to say it without dealing with much details. But if you’re eager to learn more, I recommend Patrick Farley’s post about metaclasses. There are also a lot of links there to dig deeper.