Sunday, February 24, 2008

Ruby: Creating Anonymous Classes

Classes in Ruby are first-class objects—each is an instance of class Class. --
Most classes are defined using the syntax of the following example.

class Person

Defining classes this way is familiar to most developers. Ruby provides another syntax for defining classes using The following example also defines the Person class.

Person = do
end creates a new anonymous (unnamed) class with the given superclass (or Object if no parameter is given). You can give a class a name by assigning the class object to a constant. --
The following example shows that the new class begins as an anonymous Class instance, but becomes a named class when it's assigned to a constant.

klass =
klass.ancestors # => [#<Class:0x21b38>, Object, Kernel] # => #<Class:0x21b38>

Person = klass
Person.ancestors # => [Person, Object, Kernel] # => Person

klass.ancestors # => [Person, Object, Kernel] # => Person
klass # => Person

I generally use traditional syntax when defining named classes, but I have found anonymous classes very helpful when creating maintainable tests. For example, I often need to test instance methods of a Module. The following tests show how you can define a class, include a module, and assert the expected value all within one test method.

require 'test/unit'

module Gateway
def post(arg)
# implementation...

class GatewayTest < Test::Unit::TestCase
def test_post_returns_true
klass = do
include Gateway
assert_equal true,

There are other ways to solve this issue, but I prefer this solution because it keeps everything necessary for the test within the test itself.

Another advantage to defining classes using is that you can pass a block to the new method; therefore, the block could access variables defined within the same scope. In practice, I've never needed this feature, but it's worth noting.
Post a Comment