Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > UnboundMethodクラス
class UnboundMethod
クラスの継承リスト: UnboundMethod < Object < Kernel < BasicObject
Abstract
レシーバを持たないメソッドを表すクラスです。 呼び出すためにはレシーバにバインドする必要があります。
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
self === other -> bool
-
自身と other が同じクラスあるいは同じモジュールの同じメソッドを表す場合に true を返します。そうでない場合に false を返します。
- [PARAM] other:
- 自身と比較したいオブジェクトを指定します。
a = String.instance_method(:size) b = String.instance_method(:size) p a == b #=> true c = Array.instance_method(:size) p a == c #=> false
[SEE_ALSO] UnboundMethod#eql?
arity -> Integer
-
メソッドが受け付ける引数の数を返します。
ただし、メソッドが可変長引数を受け付ける場合、負の整数
-(必要とされる引数の数 + 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
-
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)
eql?(other) -> bool
equal?(other) -> bool
-
指定された other が self 自身である場合のみ真を返します。 これは Object クラスで定義されたデフォルトの動作で す。
- [PARAM] other:
- 自身と比較したいオブジェクトを指定します。
a = String.instance_method(:size) b = String.instance_method(:size) p a.eql?(b) #=> false p a.eql?(a) #=> true
[SEE_ALSO] UnboundMethod#==
hash -> Integer
-
自身の Object#object_id を返します。これは Object クラスで定義されたデフォルトの動作です。
name -> String
name -> Symbol
-
このメソッドの名前を返します。
owner -> Class | Module
-
このメソッドが定義されている class か module を返します。