Dr Nic

The explicit Ruby metaclass you know you always wanted

When you define a “static” or “class” method on a Ruby class, it actually stores the method on that class’s metaclass/singleton class/eigenclass.

_why’s metaid gem gives you a metaclass method to explicit access this object:

require 'metaid'
class Person
  def self.oldest
    # find oldest person
Person.methods.grep(/oldest/) # => ['oldest']
Person.metaclass.instance_methods.grep(/oldest/) # => ['oldest']

So now here’s a new, fun way to access the metaclass of a class, look for a constant suffixed with ‘Metaclass’. For the Person class, look for PersonMetaclass. Yep, we can have explicit metaclass constants. Or try PersonClass or PersonEigen or PersonEigenclass. No one can agree on what they are called, so I made them all work.

$ gem install magic_metaclass
$ irb

In irb try:

require 'rubygems'
require 'magic_metaclass'
class Person; end
# => Person
# => #<Class:Person>
# => #<Class:Person>
# => #<Class:Person>
# => #<Class:Person>


Finally, the example from above:

class Person
  def self.oldest
    # find oldest person
PersonMetaclass.instance_methods.grep(/oldest/) # => ['oldest']

I wrote this gem with no known use cases. If you find any, let me know.

Related posts:

  1. Validate and Save your Ruby in TextMate – with secret Rubinus superpowers In some TextMate bundles, if you save a file it...
  2. Future proofing your Ruby code. Ruby 1.9.1 is coming. Bugger. I’m a Ruby monogamist. I use the Ruby...
  3. Unit Testing iPhone apps with Ruby: rbiphonetest Everything to love about Ruby: the concise, powerful language;...
  4. Using Ruby within TextMate snippets and commands I didn’t know you could run Ruby within TextMate snippets....
  5. Everything you wanted to know about Ruby.NET Recently Wayne Kelly spoke at the Brisbane Ruby and Rails...

5 Responses to “The explicit Ruby metaclass you know you always wanted”

  1. Dr Nic says:

    Ooh, I should add “PersonSingleton” too.

  2. el raichu says:

    I wonder if there’s a PersonEigenEigen? Or a PersonEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigenEigen?

  3. Dr Nic says:

    @el raichu [via] – there definitely is :)

  4. haha I still have a hard time understanding why you would ever need to go any more than one level deep. I have a hard time even really understanding good use-cases for a metaclass method in the first place really (whys writing style just complicates things)

  5. Dr Nic says:

    @TJ – you probably wouldn’t have more than one level. Ever.