Class: UnboundMethod
Overview
Ruby supports two forms of objectified methods. ::Class ::Method 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 Object#method.
Ruby also supports unbound methods; methods objects that are not associated with a particular object. These can be created either by calling Module#instance_method or by calling unbind
on a bound method object. The result of both of these is an UnboundMethod
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
-
#==(other_meth) ⇒ Boolean
(also: #eql?)
Alias for Method#==.
-
#arity ⇒ Fixnum
Alias for Method#arity.
-
#bind(obj) ⇒ method
Bind umeth to obj.
-
#clone ⇒ Method
Alias for Method#clone.
-
#eql?(other_meth) ⇒ Boolean
Alias for #==.
-
#hash ⇒ Integer
Alias for Method#hash.
-
#to_s ⇒ String
Alias for Method#inspect.
-
#name ⇒ Symbol
Alias for Method#name.
-
#original_name ⇒ Symbol
Alias for Method#original_name.
-
#owner ⇒ class_or_module
Alias for Method#owner.
-
#parameters ⇒ Array
Alias for Method#parameters.
-
#source_location ⇒ Array, Fixnum
Alias for Method#source_location.
-
#super_method
Alias for Method#super_method.
-
#to_s
Alias for Method#inspect.
Instance Method Details
#==(other_meth) ⇒ Boolean
Also known as: #eql?
Alias for Method#==.
#arity ⇒ Fixnum
Alias for Method#arity.
#bind(obj) ⇒ method
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
#clone ⇒ Method
Alias for Method#clone.
#==(other_meth) ⇒ Boolean
#eql?(other_meth) ⇒ Boolean
Boolean
#eql?(other_meth) ⇒ Boolean
Alias for #==.
#hash ⇒ Integer
Alias for Method#hash.
#to_s ⇒ String
Alias for Method#inspect.
#name ⇒ Symbol
Alias for Method#name.
#original_name ⇒ Symbol
Alias for Method#original_name.
#owner ⇒ class_or_module
Alias for Method#owner.
#parameters ⇒ Array
Alias for Method#parameters.
#source_location ⇒ Array, Fixnum
Alias for Method#source_location.
#super_method
Alias for Method#super_method.
#to_s
Alias for Method#inspect.