Class: UnboundMethod
Overview
********************************************************************
Ruby supports two forms of objectified methods. Class
<code>Method</code> is used to represent methods that are associated
with a particular object: these method objects are bound to that
object. Bound method objects for an object can be created using
<code>Object#method</code>.
Ruby also supports unbound methods; methods objects that are not
associated with a particular object. These can be created either by
calling <code>Module#instance_method</code> or by calling
<code>unbind</code> on a bound method object. The result of both of
these is an <code>UnboundMethod</code> object.
Unbound methods can only be called after they are bound to an
object. That object must be be a kind_of? the method's original
class.
class Square
def area
@side * @side
end
def initialize(side)
@side = side
end
end
area_un = Square.instance_method(:area)
s = Square.new(12)
area = area_un.bind(s)
area.call #=> 144
Unbound methods are a reference to the method at the time it was
objectified: subsequent changes to the underlying class will not
affect the unbound method.
class Test
def test
:original
end
end
um = Test.instance_method(:test)
class Test
def test
:modified
end
end
t = Test.new
t.test #=> :modified
um.bind(t).call #=> :original
Instance Method Summary collapse
-
#==(other_meth) ⇒ Boolean
Two method objects are equal if that are bound to the same object and contain the same body.
-
#arity ⇒ Fixnum
Returns an indication of the number of arguments accepted by a method.
-
#bind(obj) ⇒ Object
Bind umeth to obj.
-
#clone ⇒ Object
MISSING: documentation.
-
#inspect ⇒ Object
Show the name of the underlying method.
-
#to_s ⇒ Object
Show the name of the underlying method.
Instance Method Details
#==(other_meth) ⇒ Boolean
Two method objects are equal if that are bound to the same object and contain the same body.
9017 9018 9019 |
# File 'eval.c', line 9017 static VALUE method_eq(method, other) VALUE method, other; |
#arity ⇒ Fixnum
Returns an indication of the number of arguments accepted by a method. Returns a nonnegative integer for methods that take a fixed number of arguments. For Ruby methods that take a variable number of arguments, returns -n-1, where n is the number of required arguments. For methods written in C, returns -1 if the call takes a variable number of arguments.
class C
def one; end
def two(a); end
def three(*a); end
def four(a, b); end
def five(a, b, *c); end
def six(a, b, *c, &d); end
end
c = C.new
c.method(:one).arity #=> 0
c.method(:two).arity #=> 1
c.method(:three).arity #=> -1
c.method(:four).arity #=> 2
c.method(:five).arity #=> -3
c.method(:six).arity #=> -3
"cat".method(:size).arity #=> 0
"cat".method(:replace).arity #=> 1
"cat".method(:squeeze).arity #=> -1
"cat".method(:count).arity #=> -1
9359 9360 9361 |
# File 'eval.c', line 9359 static VALUE method_arity(method) VALUE method; |
#bind(obj) ⇒ Object
Bind umeth to obj. If Klass
was the class from which umeth was obtained, obj.kind_of?(Klass)
must be true.
class A
def test
puts "In test, class = #{self.class}"
end
end
class B < A
end
class C < B
end
um = B.instance_method(:test)
bm = um.bind(C.new)
bm.call
bm = um.bind(B.new)
bm.call
bm = um.bind(A.new)
bm.call
produces:
In test, class = C
In test, class = B
prog.rb:16:in `bind': bind argument must be an instance of B (TypeError)
from prog.rb:16
9292 9293 9294 |
# File 'eval.c', line 9292 static VALUE umethod_bind(method, recv) VALUE method, recv; |
#clone ⇒ Object
MISSING: documentation
9147 9148 9149 |
# File 'eval.c', line 9147 static VALUE method_clone(self) VALUE self; |