Hi, I'm Nicholas Johnson!

software engineer / trainer / AI enthusiast

Eigenclasses (Static Methods)

In Ruby, all methods exist within a class. When you create an object, the methods for that object exist within it’s class. Methods can be public, private or protected, but there is no concept of a static method. Instead, we have singleton classes, commonly referred to as eigenclasses.

No static methods

Static methods are class methods. they belong to the class, not the instance. This would break Ruby’s simple object structure, since classes are instances of class Class, adding methods to Class, would make them available everywhere, which is not what we want.


Instead, Ruby lets us define an unnamed singleton class that sits in the inheritance tree directly above any object. Lets do this now and create a static method.

  class Kitten
    class << Kitten
      def max_size

The class << Kitten syntax opens up the eigenclass and pops the max_size method within it. We can then access it like this

  puts Kitten.max_size

Notice that we are talking to the Kitten class as an object here.


We use the class << self syntax to explicitly open an object’s eigenclass. We can accomplish the same thing using the shorthand syntax:

  def Kitten.max_size

This adds a method to the Kitten eigenclass. We can also add a method to the eigenclass of any other object, like so:

  fluffy = Kitten.new
  popsy = Kitten.new

  def popsy.deploy_wheels
    @wheels = :deployed

  def popsy.launch_scouter
    @scouter = :launched

Here we have added a method to popsy’s eigenclass, allowing her to deploy wheels.

Eigenclasses in the Inheritance Hierarchy

The eigenclass sits directly above the object in the inheritance hierarcy, below the class of the object. It provides a handy place to put methods hat we want to apply directly to the object, rather than to every instance of that object. It feels technical, but once you get it, it’s actually rather nice.

Exercise - Adding a method directly to an object

In irb (or in a ruby file) create 3 instances of your warship/pet class. Add a different method to each of them. Verify that only the instance you added the method to it to can call it.

You’re writing to an eigenclass. Feels natural doesn’t it?