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.