Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > UnboundMethodクラス
クラスの継承リスト: UnboundMethod < Object < Kernel
レシーバを持たないメソッドを表すクラスです。 呼び出すためにはレシーバにバインドする必要があります。
Module#instance_method や Method#unbind により生成し、後で UnboundMethod#bind によりレシーバを 割り当てた Method オブジェクトを作ることができます。
例: Method クラスの冒頭にある例を UnboundMethod で書くと以下のようになります。
class Foo
  def foo() "foo" end
  def bar() "bar" end
  def baz() "baz" end
end
# 任意のキーとメソッドの関係をハッシュに保持しておく
# レシーバの情報がここにはないことに注意
methods = {1 => Foo.instance_method(:foo),
           2 => Foo.instance_method(:bar),
           3 => Foo.instance_method(:baz)}
# キーを使って関連するメソッドを呼び出す
# レシーバは任意(Foo クラスのインスタンスでなければならない)
p methods[1].bind(Foo.new).call      # => "foo"
p methods[2].bind(Foo.new).call      # => "bar"
p methods[3].bind(Foo.new).call      # => "baz"
例: 以下はメソッドの再定義を UnboundMethod を使って行う方法です。普通は alias や super を使います。
class Foo
  def foo
    p :foo
  end
  @@orig_foo = instance_method :foo
  def foo
    p :bar
    @@orig_foo.bind(self).call
  end
end
Foo.new.foo
=> :bar
   :foo
self == other -> bool[permalink][rdoc]自身と other が同じクラスあるいは同じモジュールの同じメソッドを表す場合に true を返します。そうでない場合に false を返します。
a = String.instance_method(:size) b = String.instance_method(:size) p a == b #=> true c = Array.instance_method(:size) p a == c #=> false
arity -> Integer[permalink][rdoc]メソッドが受け付ける引数の数を返します。
ただし、メソッドが可変長引数を受け付ける場合、負の整数
-(必要とされる引数の数 + 1)
を返します。C 言語レベルで実装されたメソッドが可変長引数を 受け付ける場合、-1 を返します。
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 p C.instance_method(:one).arity #=> 0 p C.instance_method(:two).arity #=> 1 p C.instance_method(:three).arity #=> -1 p C.instance_method(:four).arity #=> 2 p C.instance_method(:five).arity #=> -3 p C.instance_method(:six).arity #=> -3 String.instance_method(:size).arity #=> 0 String.instance_method(:replace).arity #=> 1 String.instance_method(:squeeze).arity #=> -1 String.instance_method(:count).arity #=> -1
bind(obj) -> Method[permalink][rdoc]self を obj にバインドした Method オブジェクトを生成して返します。
NOTE: Ruby 1.8.xでモジュールのインスタンスメソッドをbindすると不審な挙動を するので避けるべきである。
# クラスのインスタンスメソッドの UnboundMethod の場合
class Foo
  def foo
    "foo"
  end
end
# UnboundMethod `m' を生成
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo#foo>
# Foo のインスタンスをレシーバとする Method オブジェクトを生成
p m.bind(Foo.new)               # => #<Method: Foo#foo>
# Foo のサブクラス Bar のインスタンスをレシーバとする Method
class Bar < Foo
end
p m.bind(Bar.new)               # => #<Method: Bar(Foo)#foo>
# モジュールのインスタンスメソッドの UnboundMethod の場合
module Foo
  def foo
    "foo"
  end
end
# UnboundMethod `m' を生成
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo#foo>
# Foo をインクルードしたクラス Bar のインスタンスをレシーバと
# する Method オブジェクトを生成
class Bar
  include Foo
end
p m.bind(Bar.new)               # => #<Method: Bar(Foo)#foo>
clone -> Method[permalink][rdoc]自身を複製した UnboundMethod オブジェクトを作成して返します。
inspect -> String[permalink][rdoc]to_s -> Stringself を読みやすい文字列として返します。
詳しくは Method#inspect を参照してください。
[SEE_ALSO] Method#inspect
name -> String[permalink][rdoc]このメソッドの名前を返します。
owner -> Class | Module[permalink][rdoc]このメソッドが定義されている class か module を返します。