I seemed to have accidently started a twitter storm debate
on metaclasses in Ruby. Somethings are just are to say in 140
characters. So here’s my take on the issue.
Singleton Class / Eigenclass / Metaclass … What?
Ruby has this concept of per-class methods. In other words, you
can define a method on an object, rather than on its class. Such
per-object methods are callable on that object only, and not any other
object in the same class.
Implementation wise, these per-object methods are defined in an
almost invisible class-like object called the “Singleton Class”. The
singleton class injects itself into the object’s method lookup list
immediately prior to the object’s class.
Some people object to the name “singleton class”, complaining that
it is easily confused with the singleton pattern from the Gang of Four
book. Other suggested names are “Eigenclass” and “Metaclass”.
I objected to the use of the name “metaclass” for the singleton
class on the grounds that metaclass has a well understood meaning in
non-Ruby circles, and that the singleton class is not a metaclass.
In object-oriented programming, a metaclass is a class whose
instances are classes. Just as an ordinary class defines the behavior
of certain objects, a metaclass defines the behavior of certain
classes and their instances.
I get two things out of this: (1) instances of metaclasses are
classes, and (2) the metaclass defines the behavior of a class.
So Singleton classes aren’t Metaclasses?
No, not according to the definition of metaclass.
In general, instances of singleton classes are regular objects, not
classes. Singleton classes define the behavior of regular objects,
not class objects.
But Everybody Calls them Metaclasses!
I can’t change what everybody calls them. But calling a dog a
horse doesn’t make it a horse. I’m just pointing out that the common
usage of the term metaclass is contrary to the definition of metaclass
used outside the Ruby community.
Does Ruby have Metaclasses?
Yes … I mean no … well maybe.
Is there something that creates classes in Ruby? Yes, the class
Class is used to create new classes. (e.g. Class.new). All
classes are instances of Class.
Is there something that defines the behavior of classes? Yes, any
class can have its own behavior by defining singleton methods. The
singleton methods go into the singleton class of the class.
Ruby doesn’t have a single “thing” that is a full metaclass. The
role of a metaclass is split between Class (to create new classes) and
singleton classes of classes (to define class specific behavior).
So, Singleton Classes Are Metaclasses?
You weren’t listening. Not all singleton classes are metaclasses.
Only singleton classes of classes are metaclasses. And then only
weak, partial metaclasses.
Does it Matter What We Call Them?
In the long run, probably not. Most people seem happy to
(incorrectly) call them metaclasses, and this post is unlikely to
change that behavior. Shoot, it seems the Rails team has already
immortalized
the term.
However, if reading this post has helped you understand what real
metaclasses are, then it was worthwhile.