instance method BasicObject#method_missing

method_missing(name, *args) -> object[permalink][rdoc][edit]

呼びだされたメソッドが定義されていなかった時、Rubyインタプリタがこのメソッドを呼び出します。

呼び出しに失敗したメソッドの名前 (Symbol) が name にその時の引数が第二引数以降に渡されます。

デフォルトではこのメソッドは例外 NoMethodError を発生させます。

[PARAM] name:
未定義メソッドの名前(シンボル)です。
[PARAM] args:
未定義メソッドに渡された引数です。
[RETURN]
ユーザー定義の method_missing メソッドの返り値が未定義メソッドの返り値であるかのように見えます。


class Foo
  def initialize(data)
    @data = data
  end
  def method_missing(name, lang)
    if name.to_s =~ /\Afind_(\d+)_in\z/
      if @data[lang]
        p @data[lang][$1.to_i]
      else
        raise "#{lang} unknown"
      end
    else
      super
    end
  end
end

dic = Foo.new({:English => %w(zero one two), :Esperanto => %w(nulo unu du)})
dic.find_2_in :Esperanto #=> "du"

[注意] このメソッドを override する場合は対象のメソッド名に対して Object#respond_to? が真を返すようにしてください。そのためには、Object#respond_to_missing? も同様に override する必要があります。

[SEE_ALSO] Object#respond_to?, Object#respond_to_missing?