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

class Method

クラス・モジュールの継承リスト: Method < Object < Kernel < BasicObject

要約

Object#method によりオブジェクト化されたメソッドオブジェクトのクラスです。

メソッドの実体(名前でなく)とレシーバの組を封入します。 Proc オブジェクトと違ってコンテキストを保持しません。

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#public_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.public_send(methods[1])      # => "foo"
p Foo.new.public_send(methods[2])      # => "bar"
p Foo.new.public_send(methods[3])      # => "baz"

@see Object#method

インスタンスメソッド

定義 説明
self == other -> bool
eql?(other) -> bool

自身と other が同じインスタンスの同じメソッドを表す場合に true を返します。そうでない場合に false を返します。

self[*args] -> object
call(*args) -> object
call(*args) { ... } -> object

メソッドオブジェクトに封入されているメソッドを起動します。

arity -> Integer

メソッドが受け付ける引数の数を返します。

clone -> Method

自身を複製した Method オブジェクトを作成して返します。

curry -> Proc
curry(arity) -> Proc

self を元にカリー化した Proc を返します。

hash -> Integer

自身のハッシュ値を返します。

inspect -> String
to_s -> String

self を読みやすい文字列として返します。

name -> Symbol

このメソッドの名前を返します。

original_name -> Symbol

オリジナルのメソッド名を返します。

owner -> Class | Module

このメソッドが定義されている class か module を返します。

parameters -> [object]

Method オブジェクトの引数の情報を返します。

receiver -> object

このメソッドオブジェクトのレシーバを返します。

source_location -> [String, Integer] | nil

ソースコードのファイル名と行番号を配列で返します。

super_method -> Method | nil

self 内で super を実行した際に実行されるメソッドを Method オブジェクトにして返します。

to_proc -> Proc

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

unbind -> UnboundMethod

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

継承したメソッド

! != __id__ __send__ instance_eval instance_exec method_missing singleton_method_added singleton_method_removed singleton_method_undefined !~ <=> === =~ _dump class clone define_singleton_method display enum_for equal? extend freeze frozen? initialize initialize_copy instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? itself marshal_dump marshal_load method methods nil? object_id pretty_inspect pretty_print pretty_print_cycle pretty_print_inspect pretty_print_instance_variables private_methods protected_methods psych_to_yaml public_method public_methods public_send remove_instance_variable respond_to? respond_to_missing? send singleton_class singleton_method singleton_methods taint tainted? tap to_a to_ary to_hash to_int to_io to_regexp to_str trust untaint untrust untrusted? .new .yaml_tag ::ARGF ::ARGV ::DATA ::ENV ::FALSE ::NIL ::RUBY_COPYRIGHT ::RUBY_DESCRIPTION ::RUBY_ENGINE ::RUBY_ENGINE_VERSION ::RUBY_PATCHLEVEL ::RUBY_PLATFORM ::RUBY_RELEASE_DATE ::RUBY_REVISION ::RUBY_VERSION ::SCRIPT_LINES__ ::STDERR ::STDIN ::STDOUT ::TOPLEVEL_BINDING ::TRUE