Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Methodクラス
クラスの継承リスト: Method < Object < Kernel < BasicObject
Object#method によりオブジェクト化され たメソッドオブジェクトのクラスです。
メソッドの実体(名前でなく)とレシーバの組を封入します。 Proc オブジェクトと違ってコンテキストを保持しません。
Method は取り出しの対象であるメソッドが なければ作れませんが、Proc は準備なしに作れます。その点から Proc は使い捨てに向き、Method は何度も繰り返し生成する 場合に向くと言えます。また内包するコードの大きさという点では Proc は小規模、Method は大規模コードに向くと言えます。
既存のメソッドを Method オブジェクト化する。
class Foo def foo(arg) "foo called with arg #{arg}" end end m = Foo.new.method(:foo) p m # => #<Method: Foo#foo> p m.call(1) # => "foo called with arg 1"
名前のないメソッド(の代わり)が必要なら Proc を使うと良い。
pr = Proc.new {|arg| "proc called with arg #{arg}" } p pr # => #<Proc:0x401b1fcc> p pr.call(1) # => "proc called with arg 1"
Method オブジェクトが有用なのは以下のような場合。
class Foo def foo() "foo" end def bar() "bar" end def baz() "baz" end end obj = Foo.new # 任意のキーとメソッドの関係をハッシュに保持しておく methods = {1 => obj.method(:foo), 2 => obj.method(:bar), 3 => obj.method(:baz)} # キーを使って関連するメソッドを呼び出す p methods[1].call # => "foo" p methods[2].call # => "bar" p methods[3].call # => "baz"
しかし、レシーバを固定させる(Method オブジェクトはレシーバを保持する)必 要がないなら Object#sendを使う方法も有用。
class Foo def foo() "foo" end def bar() "bar" end def baz() "baz" end end # 任意のキーとメソッド(の名前)の関係をハッシュに保持しておく # レシーバの情報がここにはないことに注意 methods = {1 => :foo, 2 => :bar, 3 => :baz} # キーを使って関連するメソッドを呼び出す # レシーバは任意(Foo クラスのインスタンスである必要もない) p Foo.new.send(methods[1]) # => "foo" p Foo.new.send(methods[2]) # => "bar" p Foo.new.send(methods[3]) # => "baz"
@see Object#method
self == other -> bool
[permalink][rdoc]eql?(other) -> bool
自身と other が同じインスタンスの同じメソッドを表す場合に true を返します。そうでない場合に false を返します。
s = "bar" a = s.method(:size) b = s.method(:size) p a == b #=> true
self[*args] -> object
[permalink][rdoc]call(*args) -> object
call(*args) { ... } -> object
メソッドオブジェクトに封入されているメソッドを起動します。
引数やブロックはそのままメソッドに渡されます。
self[] の形の呼び出しは通常のメソッド呼び出しに見た目を 近付けるためだけに用意されたもので、Array#[]のような 他の [] メソッドとの意味的な関連性はありません。
メソッドオブジェクトが汚染されている場合、そのメソッドは、セーフレベル 4 で実行されます
[SEE_ALSO] セキュリティモデル
arity -> Fixnum
[permalink][rdoc]メソッドが受け付ける引数の数を返します。
ただし、メソッドが可変長引数を受け付ける場合、負の整数
-(必要とされる引数の数 + 1)
を返します。C 言語レベルで実装されたメソッドが可変長引数を 受け付ける場合、-1 を返します。
例:
class C def u; end def v(a); end def w(*a); end def x(a, b); end def y(a, b, *c); end def z(a, b, *c, &d); end end c = C.new p c.method(:u).arity #=> 0 p c.method(:v).arity #=> 1 p c.method(:w).arity #=> -1 p c.method(:x).arity #=> 2 p c.method(:y).arity #=> -3 p c.method(:z).arity #=> -3 s = "xyz" s.method(:size).arity #=> 0 s.method(:replace).arity #=> 1 s.method(:squeeze).arity #=> -1 s.method(:count).arity #=> -1
clone -> Method
[permalink][rdoc]自身を複製した Method オブジェクトを作成して返します。
hash -> Integer
[permalink][rdoc]自身のハッシュ値を返します。
eql? が真でも hash が一致しない場合があるので Array#uniq などが意図通り動作しないことがあります。 この挙動はバグなので Ruby2.0.0 以降では修正済みです。[ruby-core:42755]
a = method(:==) b = method(:eql?) p a.eql? b # => true p a.hash == b.hash # => false p [a, b].uniq.size # => 2
inspect -> String
[permalink][rdoc]to_s -> String
self を読みやすい文字列として返します。
以下の形式の文字列を返します。
#<Method: klass1(klass2)#method> (形式1)
klass1 は、Method#inspect では、レシーバのクラス名、 UnboundMethod#inspect では、UnboundMethod オブジェクトの生成 元となったクラス/モジュール名です。
klass2 は、実際にそのメソッドを定義しているクラス/モジュール名、 method は、メソッド名を表します。
module Foo def foo "foo" end end class Bar include Foo def bar end end p Bar.new.method(:foo) # => #<Method: Bar(Foo)#foo> p Bar.new.method(:bar) # => #<Method: Bar(Bar)#bar>
klass1 と klass2 が同じ場合は以下の形式になります。
#<Method: klass1#method> (形式2)
特異メソッドに対しては、
#<Method: obj.method> (形式3) #<Method: klass1(klass2).method> (形式4)
という形式の文字列を返します。二番目の形式では 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> # 以下は(形式1)の出力になる module Baz def baz end end class <<obj include Baz end p obj.method(:baz) # => #<Method: Object(Baz)#baz>
[SEE_ALSO] Object#inspect
name -> Symbol
[permalink][rdoc]このメソッドの名前を返します。
owner -> Class | Module
[permalink][rdoc]このメソッドが定義されている class か module を返します。
parameters -> [object]
[permalink][rdoc]Method オブジェクトの引数の情報を返します。
Method オブジェクトが引数を取らなければ空の配列を返します。引数を取る場合は、配列の配列を返し、 各配列の要素は引数の種類に応じた以下のような Symbol と、仮引数の名前を表す Symbol の 2 要素です。 組み込みのメソッドでは、仮引数の名前が取れません。
必須の引数
デフォルト値が指定されたオプショナルな引数
* で指定された残りすべての引数
& で指定されたブロック引数
例:
m = Class.new{define_method(:m){|x, y=42, *other, &b|}}.instance_method(:m) m.parameters #=> [[:req, :x], [:opt, :y], [:rest, :other], [:block, :b]] File.method(:symlink).parameters #=> [[:req], [:req]]
[SEE_ALSO] Proc#parameters
receiver -> object
[permalink][rdoc]このメソッドオブジェクトのレシーバを返します。
source_location -> [String, Fixnum] | nil
[permalink][rdoc]ソースコードのファイル名と行番号を配列で返します。
その手続オブジェクトが ruby で定義されていない(つまりネイティブ である)場合は nil を返します。
[SEE_ALSO] Proc#source_location
to_proc -> Proc
[permalink][rdoc]self を call する Proc オブジェクトを生成して返します。
unbind -> UnboundMethod
[permalink][rdoc]self のレシーバとの関連を取り除いた UnboundMethod オブ ジェクトを生成して返します。