Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > UnboundMethodクラス

class UnboundMethod

クラスの継承リスト: UnboundMethod < Object < Kernel < BasicObject

Abstract

レシーバを持たないメソッドを表すクラスです。 呼び出すためにはレシーバにバインドする必要があります。

Module#instance_methodMethod#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 を返します。

Methods

Classes