Q: How do you tell if a given class is an ordinary class or a singleton class?

A: Test whether the class is the first element in its own ancestor list.

class NotASingleton
  self == ancestors.first       # => true

class << Object.new
   self == ancestors.first       # => false

As you can see, ordinary classes have themselves as first ancestor. Singleton classes do not have themselves as an ancestor.

Published by Avdi Grimm


  1. Why would you ever need to know?

    • It's important for certain metaprogramming tasks. If I've defined a module that does some metaprogramming when it is included in a class, it may need to know if it has been included in a singleton class or a “normal” class (or another module).


Leave a Reply

Your email address will not be published. Required fields are marked *