Question

méthode_missing

*obj.method_missing( symbole h , args i ) → autre_obj

Invoqué par Ruby Lorsque OBJ est envoyé un message, il ne peut pas gérer.Le symbole est le symbole de la méthode appelée, et les arguments sont tous les arguments qui lui ont été transmis.L’exemple ci-dessous crée une classe Roman, qui répond aux méthodes dont le nom est composé de chiffres romains, renvoyant le valeurs entières correspondantes.Un plus grand nombre de L’utilisation typique de method_missing est de implémenter des proxys, des délégants et des Transitaires.

class Roman
  def roman_to_int(str)
    # ...
  end
  def method_missing(method_id)
    str = method_id.id2name
    roman_to_int(str)
  end
end
r = Roman.new
r.iv ! 4
r.xxiii ! 23
r.mm ! 2000

Je viens d'entendre parler de méthode manquante et je suis allé en savoir plus sur Programmation Ruby mais l'explication ci-dessus citée dans le livre me dépasse.Quelqu'un a-t-il une explication plus simple ?Plus précisément, la méthode manquante n'est-elle utilisée que par l'interprète ou est-il nécessaire de l'appeler directement dans un programme (en supposant que j'écris simplement des applications Web, par opposition à l'écriture de code pour la NASA) ?

Était-ce utile?

La solution

Ruby n'a pas application de type, et ne pas non plus faire aucune vérification quant à ce que les méthodes d'un objet a lorsque le script est d'abord analysée, car cela peut être modifié de manière dynamique que l'application est exécutée.

Qu'est-ce que method_missing le fait, est vous permettent d'intercepter et de traiter les appels aux méthodes qui n'existent pas pour un objet donné. Cela fournit la puissance sous le capot derrière à peu près tous les DSL (langage spécifique à un domaine) écrit en Ruby.

Dans le cas de l'exemple, chacun des « r.iv », « r.mm », et ainsi de suite est en fait un appel de méthode à l'objet romain. Bien sûr, il ne dispose pas d'une méthode « iv » ou un « mm », donc au lieu de contrôle est passé à method_missing, qui obtient le nom de la méthode qui a été appelé, ainsi que tous les arguments ont été adoptés.

method_missing convertit alors le nom de la méthode d'un symbole à une chaîne, et comme parse chiffre romain, retournant la sortie sous forme d'entier.

Autres conseils

Il est probablement préférable de ne pas considérer Ruby comme ayant des méthodes.Lorsque vous appelez une "méthode" Ruby, vous envoyez en fait un message à cette instance (ou classe) et si vous avez défini un gestionnaire pour le message, il est utilisé pour traiter et renvoyer une valeur.

Donc method_missing est une définition spéciale qui est appelée chaque fois que Ruby ne trouve pas de gestionnaire approprié.Vous pourriez aussi y penser comme à un * méthode.

Il est essentiellement un fourre-tout pour les messages qui ne correspondent pas à des méthodes. Il est largement utilisé dans le dossier actif pour Finders dynamiques. Il est ce que vous permet d'écrire quelque chose comme ceci:

SomeModel.find_by_name_and_number(a_name, a_number)

Le modèle ne contient pas de code pour cette find_by, donc method_missing est appelé qui ressemble dit à iS - Je reconnais que le format et l'exécute. Si elle ne le fait pas, alors vous obtenez une méthode introuvable erreur.

Dans l'exemple romain vous fournissiez montre comment vous pouvez étendre la fonctionnalité d'une classe sans définir explicitement les méthodes.

r.iv est pas une méthode si method_missing attrape et appelle roman_to_int sur l'ID de la méthode « iv »

Il est également utile lorsque vous voulez gérer les méthodes non reconnues ailleurs, comme les procurations, délégant, et les transitaires, les états de documentation.

Vous n'appelez pas « method_missing » (l'interprète appelle). Au contraire, vous définir il (la remplacer) pour une classe que vous voulez faire pour être plus flexible. Comme mentionné dans d'autres commentaires, l'interprète appellera votre version de method_missing lorsque la classe (ou par exemple) ne ( « explicitement »?) Définir la méthode demandée. Cela vous donne une chance de faire quelque chose, selon la méthode succédané / nom du message.

Avez-vous déjà fait une programmation « de réflexion » en Java? En utilisant cette méthode serait comme si la classe est accessible via la réflexion pourrait regarder la chaîne (excusez-moi, « symbole ») du nom de la méthode si une exception sans cette méthode a été lancée, puis faire quelque chose comme cette méthode de la mise en œuvre à la volée.

La programmation dynamique est une sorte de "one-up" à la réflexion.

Puisque vous mentionnez des applications Web Je suppose que vous connaissez avec Ruby on Rails. Un bon exemple de la façon dont method_missing peut être utilisé est les différentes méthodes de find_by_<whatever> qui est disponible. Aucune de ces méthodes existent réellement! Ils sont synthétisés au cours de l'exécution. Tout cela se produit parce que la magie de la façon dont Ruby interceptent de méthodes non invocations existantes.

Vous pouvez en lire plus à ce sujet et d'autres utilisations de method_missing ici .

ActiveRecord utilise method_missing pour définir les méthodes find_by. Mais depuis, method_missing est essentiellement une méthode de dernier recours, cela peut être un sérieux goulot d'étranglement de performance. Ce que je découvert que ActiveRecord fait un peu plus metaprogramming impressionnant en définissant la nouvelle méthode de recherche comme méthode de classe !! Ainsi, d'autres appels à la même méthode de recherche ne frapperait pas le method_missing car il est maintenant une méthode de classe. Pour plus de détails sur l'extrait de code réel de base.rb, cliquez sur ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top