サーチ…


パラメーター

パラメータ詳細
方法上記の例では:say_moo 、これは記号であることに注意してください。
* args このメソッドに渡される引数。任意の数を指定できます。
&ブロック呼び出されたメソッドのブロック。これはdoブロックか{ }囲まれたブロックのいずれかになります

備考

この関数の最後には常にsuperを呼び出します。これにより、何かが呼び出されたときにサイレントエラーが保存され、エラーは発生しません。

たとえば、このmethod_missingは問題を引き起こします。

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say"
      speak
    end
  end
end

=> Animal.new.foobar
=> nil # This should really be raising an error

method_missingは、適切なときに使用するのに適したツールですが、考慮すべき2つのコストがあります。まず、 method_missingはあまり効率的ではありません - ルビは、このアプローチに後戻りする前に、クラスとすべての祖先を検索する必要があります。このパフォーマンスペナルティは単純なケースでは些細かもしれませんが、合算することができます。第2に、より広義には、実装が安全であること、悪意のある入力や予期しない入力などを適切に処理する責任を伴う大きな力を持つメタプログラミングの一形態です。

respond_to_missing?もオーバーライドする必要がありますrespond_to_missing?そのようです:

class Animal
  def respond_to_missing?(method, include_private = false)
    method.to_s.start_with?("say_") || super
  end
end

=> Animal.new.respond_to?(:say_moo) # => true

未定義のメソッドへの呼び出しをキャッチする

class Animal
  def method_missing(method, *args, &block)
    "Cannot call #{method} on Animal"
  end
end

=> Animal.new.say_moo 
> "Cannot call say_moo on Animal"

欠落しているメソッドを使用する

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say"
      speak
    else
      super
    end
  end
end

=> a = Animal.new
=> a.say_moo
=> "moo"
=> a.shout_moo
=> NoMethodError: undefined method `shout_moo'

ブロックで使用する

class Animal
  def method_missing(method, *args, &block)
    if method.to_s == 'say'
      block.call
    else
      super
    end
  end
end

 => Animal.new.say{ 'moo' }
 => "moo" 

パラメータで使用する

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say" && speak
      return speak.upcase if args.first == "shout"
      speak
    else
      super
    end
  end
end

=> Animal.new.say_moo
=> "moo" 
=> Animal.new.say_moo("shout")
=> "MOO" 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow