Looking for ruby Keywords? Try Ask4Keywords

Ruby Languagemethod_missing


Paramètres

Paramètre Détails
méthode Le nom de la méthode qui a été appelée (dans l'exemple ci-dessus, c'est :say_moo , notez qu'il s'agit d'un symbole.
* args Les arguments transmis à cette méthode. Peut être n'importe quel nombre, ou aucun
&bloc Le bloc de la méthode appelée, il peut s'agir d'un bloc do ou d'un bloc { }

Remarques

Appelez toujours super, au bas de cette fonction. Cela évite les pannes silencieuses lorsque quelque chose est appelé et que vous n'obtenez pas d'erreur.

Par exemple, cette méthode_missing va causer des problèmes:

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 est un bon outil à utiliser lorsque cela est approprié, mais vous devez tenir compte de deux coûts. Premièrement, method_missing est moins efficace - ruby ​​doit rechercher la classe et tous ses ancêtres avant de pouvoir method_missing cette approche; Cette pénalité de performance peut être triviale dans un cas simple, mais peut s’ajouter. Deuxièmement et plus largement, il s’agit d’une forme de méta-programmation dotée d’une grande puissance qui implique la responsabilité de garantir la sécurité de l’implémentation, de gérer correctement les entrées malveillantes, les entrées inattendues, etc.

Vous devriez également écraser respond_to_missing? ainsi:

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

method_missing Exemples Liés