O'Reilly logo

The Ruby Programming Language by David Flanagan, Yukihiro Matsumoto

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Method Objects

Ruby’s methods and blocks are executable language constructs, but they are not objects. Procs and lambdas are object versions of blocks; they can be executed and also manipulated as data. Ruby has powerful metaprogramming (or reflection) capabilities, and methods can actually be represented as instances of the Method class. (Metaprogramming is covered in Chapter 8, but Method objects are introduced here.) You should note that invoking a method through a Method object is less efficient than invoking it directly. Method objects are not typically used as often as lambdas and procs.

The Object class defines a method named method. Pass it a method name, as a string or a symbol, and it returns a Method object representing the named method of the receiver (or throws a NameError if there is no such method). For example:

m = 0.method(:succ)  # A Method representing the succ method of Fixnum 0

In Ruby 1.9, you can also use public_method to obtain a Method object. It works like method does but ignores protected and private methods (see Method Visibility: Public, Protected, Private).

The Method class is not a subclass of Proc, but it behaves much like it. Method objects are invoked with the call method (or the [] operator), just as Proc objects are. And Method defines an arity method just like the arity method of Proc. To invoke the Method m:

puts m.call    # Same as puts 0.succ. Or use puts m[].

Invoking a method through a Method object does not change the invocation semantics, nor ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required