38 votes

Comment convertir une chaîne en méthode de classe?

Voici comment convertir une chaîne en classe dans Rails / Ruby:

 p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
 

Mais que se passe-t-il si je récupère une méthode à partir d'un tableau / objet d'enregistrement actif comme:

 Post.description
 

mais ça pourrait être

 Post.anything
 

où tout est une chaîne comme anything = "description" .

C'est utile car je veux refactoriser une classe très grande et réduire les lignes de code et la répétition. Comment puis-je le faire fonctionner?

66voto

shingara Points 26980
Post.send(anything)

15voto

tadman Points 70178

Bien que eval puisse être un outil utile pour ce genre de chose, et que ceux d'autres horizons puissent l'utiliser aussi souvent que l'on pourrait le faire avec un ouvre-boîte, il est en fait dangereux de l'utiliser avec tant de désinvolture. Eval implique que tout peut arriver si vous ne faites pas attention.

Une méthode plus sûre est la suivante:

 on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)
 

L'objet # send appellera la méthode que vous voulez. Vous pouvez envoyer un symbole ou une chaîne et à condition que la méthode ne soit pas privée ou protégée, devrait fonctionner.

15voto

Intentss Points 4591

Puisqu'il s'agit d'une question Ruby on Rails, je vais développer un peu.

Dans Rails 3, en supposant que title est le nom d'un champ sur un objet ActiveRecord, alors ce qui suit est également valide:

 @post = Post.new
method = "title"

@post.send(method)                # => @post.title
@post.send(method+'=',"New Name") # => @post.title = "New Name"
 

0voto

sameera207 Points 7885

Essaye ça:

 class Test
 def method_missing(id, *args)
   puts id - get your method name
   puts args - get values    
 end
end

a = Test.new
a.name('123')
 

donc la syntaxe générale serait a.<anything>(<any argument>)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X