2010-08-26 15 views
1

J'essaie de définir un ensemble de fonctions où je peux passer dans les paramètres donnés. Par exemple, comment je fais ce qui suit?Définition de méthodes à la volée dans Ruby/Rails - comment paramétrer?

>> get_1_type("xxx") 

V4_RELATIONSHIP_TYPES=[1=>2,3=>4] 

V4_RELATIONSHIP_TYPES.keys.each do |key| 
self.class.send(:define_method, "get_#{key}_type".downcase) do 
    return GuidInfo.get_or_new(PARAMS, V4_RELATIONSHIP_TYPES[key]) 
end 
end 

# i can call -> get_1_type("xxx") , and get the function called 

Répondre

6

Essayez ceci:

V4_RELATIONSHIP_TYPES.keys.each do |key| 
self.class.send(:define_method, "get_#{key}_type".downcase) do |param| 
    # use param 
    return GuidInfo.get_or_new(PARAMS, V4_RELATIONSHIP_TYPES[key]) 
end 
end 

maintenant, vous pouvez appeler la méthode avec un paramètre:

get_1_type("xxx") 

Modifier 1

Quelques liens sur les blocs Ruby:

Start with this one

Link 1

Link 2

+0

merci, c'est génial! Cela vous dérange-t-il d'expliquer ce que ça fait vraiment? En particulier, je ne comprends pas comment le bloc fonctionne –

+0

Le bloc est utilisé comme corps de la méthode et les paramètres du bloc sont utilisés comme paramètres de la méthode. –

+0

merci beaucoup! J'ai toujours la tête tournée vers le bloc, le rendement, etc. Comment êtes-vous devenu compétent? –

1

Je ne sais pas pourquoi vous devez créer une méthode de cette façon au lieu d'ouvrir la classe à nouveau et l'insertion de votre méthode, mais vous pouvez utiliser à la place class_eval:

self.class.class_eval %Q{ 
    def get_#{key.downcase}_type(...) 
    ... 
    end 
}