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 ...

Get The Ruby Programming Language now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.