メタプログラミングRuby 第三章 method_missing

前回、動的メソッドを説明しました。今回は method_missingをまとめていきます。

mehod_missing

メソッド呼び出しの際に見つからなかった際に呼び出されるメソッドです。 以下にコード例を書いておきます。

class TestMethod
end

obj = TestMethod.new
obj.ghost(2) # undefined method `ghost' for #<TestMethod:0x007fab87884cc8> (NoMethodError)

method_objectは BasicObject(Objectクラスのメソッド kernelメソッドを持たない) で定義されているのでほぼ全てのオブジェクトに対応しています。

使い方

“ドキュメント”を確認すると、 ↓のように書くようです。

def method_missing(method_name [, *args [, &block]])

重要な箇所は以下の点です。 - 第一引数は method名 (method_name) - 第二引数は 引数 or block (*args blocks)

コード例を以下に記載します。

class TestMethod
  def method_missing(method,input)
    puts method
    puts input
  end
end

obj = TestMethod.new
obj.ghost(2) # ghost  2

method_missingメソッドは メソッド名を引数に持つのでメソッドに応じた処理を 記述することも可能です。

レシーバに対応するメソッドがなく、method_missingで対応した処理を ゴーストメソッド と呼ぶ。

ひとまず、三章ブログはここで一段落としておきます。

動的プロキシ等、残った重要トピックは気が向いた時に追記していきます。

次回は 第四章ブロック やります!