11
votes

Comment créer de manière dynamique des méthodes d'instance au moment de l'exécution?

[ruby 1.8] strong>

suppose que j'ai: p> xxx pré>

maintenant, il s'agit d'un appel à une méthode d'entrée en tant qu'arguments d'entrée une chaîne et un bloc. Nice. P>

Supposons maintenant que je peux avoir beaucoup d'appels similaires (noms de méthodes différents, mêmes arguments). Exemple: P>

otherdummy "string" do
    puts "thing"
end


0 commentaires

3 Réponses :


8
votes

J'aime particulièrement utiliser Méthode_MISSING CODE>, en particulier lorsque le code que vous souhaitez utiliser est très similaire sur les différents appels de méthode. Voici un exemple de ce site - Chaque fois que quelqu'un appelle quelqu'un x.boo code> et boo code> n'existe pas, méthod_missing est appelé avec boo code>, les arguments à boo code >, et (éventuellement) un bloc: xxx pré>

Define_Method code> On dirait également que cela fonctionnerait pour vous, mais j'ai moins d'expérience avec elle que Method_missing . Voici l'exemple du même lien: P>

%w(user email food).each do |meth|
  define_method(meth) { @data[meth.to_sym] }
end


1 commentaires

Merci d'un exemple utile (j'ai aussi besoin de gérer les noms de méthodes de cette façon). Je vais certainement aller avec méthody_missing en tant que méthodes ne connaissant pas a priori.



8
votes

Oui, il y a quelques options.

Le premier est méthod_missing . Son premier argument est un symbole qui est la méthode qui a été appelée, et les arguments restants sont les arguments utilisés. xxx

L'autre option crée de manière dynamique les méthodes d'instance à Runtime, si vous savez à l'avance, quelles méthodes seront nécessaires. Cela devrait être fait dans la classe, et un exemple est comme celui-ci: xxx

Il est un modèle courant d'avoir définir_method appelé dans une méthode de classe qui doit créer de nouvelles méthodes d'instance à l'exécution.


1 commentaires

Je suppose que ce serait met "je suis la méthode # {n}!" . Quoi qu'il en soit, bonne réponse!



3
votes

Utilisez DEFINE_METHOD:

content goes here


0 commentaires