Variables dans les noms de méthode ruby

J’ai le code suivant:

for atsortingbute in site.device_atsortingbutes device.atsortingbute end 

où je voudrais que le code remplace la valeur de “atsortingbut” par le nom de la méthode.

J’ai essayé le device."#{atsortingbute}" et diverses permutations.

Est-ce complètement impossible? Est-ce que je manque quelque chose?

J’ai envisagé de substituer method_missing, mais je n’arrive pas à comprendre comment cela m’aiderait quand mon problème est que je dois appeler une méthode “inconnue”.

Vous pouvez utiliser la méthode #send pour appeler la méthode de l’object par nom de méthode:

 object.send(:foo) # same as object.foo 

Vous pouvez passer des arguments à la méthode invoquée:

 object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23) 

Donc, si vous avez un nom d’atsortingbut dans la variable “atsortingbut”, vous pouvez lire l’atsortingbut de l’object avec

 object.send(atsortingbute.to_sym) 

et écrire la valeur de l’atsortingbut avec

 object.send("#{atsortingbute}=".to_sym, value) 

Dans Ruby 1.8.6, la méthode #send peut exécuter la méthode de n’importe quel object, quelle que soit sa visibilité (vous pouvez par exemple appeler des méthodes privées). Ceci est susceptible de changer dans les futures versions de Ruby et vous ne devriez pas vous y fier. Pour exécuter des méthodes privées, utilisez #instance_eval:

 object.instance_eval { # code as block, can reference variables in current scope } # or object.instance_eval <<-CODE # code as string, can generate any code text CODE 

Mettre à jour

Vous pouvez utiliser public_send pour appeler des méthodes en ce qui concerne les règles de visibilité.

 object.public_send :public_foo # ok object.public_send :private_bar # exception 

La méthode “envoyer” devrait faire ce que vous cherchez:

 object = "upcase me!" method = "upcase" object.send(method.to_sym) # => "UPCASE ME!" 

Matt et Maxim ont tous les deux raison, mais laissez de côté un détail qui pourrait vous aider à comprendre la syntaxe #send: En Ruby, l’appel d’une méthode envoie vraiment un message. Softies on Rails a une explication relativement simple à cela .

vous pouvez aussi faire

 device.instance_eval(atsortingbute)