Method

obj.method(:method_name) によりオブジェクト化され たメソッドオブジェクトのクラスです。メソッドの実体(名前でなく)とレシー バの組を封入します。Proc オブジェクトと違ってコンテキストを保持 しません。

Proc との差…Method は取り出しの対象であるメソッドが なければ作れませんが、Proc は準備なしに作れます。その点から Proc は使い捨てに向き、Method は何度も繰り返し生成する 場合に向くと言えます。また内包するコードの大きさという点では Proc は小規模、Method は大規模コードに向くと言えます。

例:

スーパークラス:

メソッド:

self[arg, ...]
call(arg ... )
call(arg ... ) { ... }

メソッドオブジェクトに封入されているメソッドを起動します。 引数やブロックはそのままメソッドに渡されます。

self[] の形の呼び出しは通常のメソッド呼び出しに見た目を 近付けるためだけに用意されたもので、Array#[]のような 他の [] メソッドとの意味的な関連性はありません。

メソッドオブジェクトが汚染されている場合、そのメソッドは、セーフレ ベル 4 で実行されます (セーフレベルに関するその他の詳細を参照)。

arity

メソッドオブジェクトの引数の数を返します。self が引数の数を 可変長で受け取れる場合

-(最低限必要な数 + 1)

を返します。

inspect

Object#inspect 参照。以下の形式の文字列を返し ます。

#<Method: klass1(klass2)#method>

klass1 は、Method#inspect では、レシーバのクラス名、 UnboundMethod#inspect では、UnboundMethod オブジェクトの生成 元となったクラス/モジュール名です。

klass2 は、実際にそのメソッドを定義しているクラス/モジュール名、 method は、メソッド名を表します。

module Foo
  def foo
    "foo"
  end
end
class Bar
  include Foo
end

p Bar.new.method(:foo)
# => #<Method: Bar(Foo)#foo>

ruby 1.7 feature: 特異メソッドに対しては、

#<Method: obj.method>
#<Method: klass1(klass2).method>

という形式の文字列を返します。二番目の形式では klass1 はレシーバ、 klass2 は実際にそのメソッドを定義しているオブジェクトになります。

obj = ""
class <<obj
  def foo
  end
end
p obj.method(:foo)      # => #<Method: "".foo>

class Foo
  def Foo.foo
  end
end
p Foo.method(:foo)      # => #<Method: Foo.foo>

class Bar < Foo
end
p Bar.method(:foo)      # => #<Method: Bar(Foo).foo>
to_proc

selfcall する Proc オブジェクトを生成して返 します。

unbind

self のレシーバとの関連を取り除いた UnboundMethod オブ ジェクトを生成して返します。