Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library _builtin > class UnboundMethod > bind

instance method UnboundMethod#bind

bind(obj) -> Method

self を obj にバインドした Method オブジェクトを生成し返します。

[PARAM] obj:
自身をバインドしたいオブジェクトを指定します。ただしバインドできるのは、 unbind したオブジェクトのクラスのインスタンスか、メソッド定義元のモジュールを インクルードしたクラスのインスタンスだけです。
[EXCEPTION] TypeError:
obj のクラスが、unbind したオブジェクトのクラスのインスタンスか、 メソッド定義元のモジュールをインクルードしたクラスでなければ、発生します。
# クラスのインスタンスメソッドの UnboundMethod の場合

class Foo
  def foo
    "foo"
  end
end

# UnboundMethod `m' を生成
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>

# Foo のインスタンスをレシーバとする Method オブジェクトを生成
p m.bind(Foo.new)               # => #<Method: Foo(Foo)#foo>

# Foo のサブクラス Bar のインスタンスをレシーバとする Method
#@#  ruby 1.8 feature: 許されるようになりました

class Bar < Foo
end
# p m.bind(Bar.new)               # => -18:in `bind': bind argument must be an instance of Foo (TypeError)

# 同名の特異メソッドが定義されているとダメ
class << obj = Foo.new
  def foo
  end
end
p m.bind(obj)                   # => -:25:in `bind': method `foo' overridden (TypeError)

# モジュールのインスタンスメソッドの UnboundMethod の場合

module Foo
  def foo
    "foo"
  end
end

# UnboundMethod `m' を生成
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>

# Foo をインクルードしたクラス Bar のインスタンスをレシーバと
# する Method オブジェクトを生成
class Bar
  include Foo
end
p m.bind(Bar.new)               # => #<Method: Bar(Foo)#foo>

# Bar のサブクラスは Foo をインクルードしているのと同等なのでよい
class Baz <Bar
end
p m.bind(Baz.new)               # => #<Method: Baz(Foo)#foo>

# 同名の特異メソッドが定義されているとダメ
class << obj = Baz.new
  def foo
  end
end
p m.bind(obj)                   # => -:27:in `bind': method `foo' overridden (TypeError)