Induction
Method
provides us with an objectification of methods that is helpful in the analysis of these methods before they are called or used. We're constantly playing with our own code, generating, toying with their intermediate object states.
method()
returns the Method
object. We call this on self
because we defined monk
in main
. Because of this objectification, our code knows more about this method than it would otherwise, as a regular definition. We can store this object and modify it through our code itself, query it and retrieve useful metadata from it.
This looks a lot like the Proc
object that we used in the Blocks chapter of "Ruby Primer: Ascent". Method
objects are, in fact, mostly like Proc
. Proc
objects however, have a binding
method which returns a Binding
object representing the context in which the Proc
was created. This is because procs have access to the local variables outside their scope. This is untrue of Method
objects because they have a self
binding. This is effectively the same as saying methods can only access variables and objects inside their own scope.
The arity
method in the above example returns a Fixnum
representing the number of arguments that the method can accept. It returns -2
because arity
returns -(n + 1)
, for n
number of required arguments. That is, -(1 + 1) = -2
as *args2
is optional. It adds a + 1
because -1
is a reserved number for functions defined using Ruby's C API. If there are no optional arguments then it just returns the correct positive value.
The parameter
method returns all the parameters that the method is defined with. It returns an array of key-value pairs. The key is a symbol representing the type of the parameter -- :req
for a mandatory parameter, :rest
, for the variable arguments, :opt
for the default optional parameters and :block
for the block parameters. The value is the symbolized form of the parameter itself.
In this example, receiver
is the object on which the method is bound and owner
is the class that object belongs to.