disons que j'ai un xml :: élément ... Je veux faire quelque chose comme: p>
my_xml_element.send ("parent.next_si_sible.next_sibling") p>
5 Réponses :
Dans votre cas, il est préférable d'utiliser et pour votre code: p> instance_eval code>
my_xml_element.instance_eval{parent.next_sibling.next_sibling}
euh, ce n'est pas vraiment ce qu'il demandait si je comprends bien sa question correctement. Je veux dire envoyer une chaîne ou un symbole en tant que ARG, et votre solution ne le fait pas. Je ne pense pas qu'il y ait une méthode intégrée qui fera ce que vous voulez, mais j'ai fouillé une méthode qui, avec un test.
require 'test/unit' class Example def multi_send(str) str.split('.').inject(self){|klass, method| klass.send(method) } end end class MyTest < Test::Unit::TestCase def test_multi_send a = Example.new methods = "class.to_s.downcase.chop!" assert a.multi_send(methods) == 'exampl' end end
Je pense que la question est que vous avez spécifiquement une série de méthodes définies comme une chaîne, et vous souhaitez appeler cela sur certains objets, non?
class Object def call_method_chain(method_chain) return self if method_chain.empty? method_chain.split('.').inject(self){|o,m| o.send(m.intern)} end end >> User.first.profile.address.state.name => "Virginia" >> User.first.call_method_chain("profile.address.state.name") => "Virginia"
Désolé, cela ne fonctionnera pas en dehors du contexte des rails depuis l'objet # essayer n'est pas défini.
En fait, Khelll a presque raison. Utilisez ceci:
methods = "power!(2).div(57).+(12).to_f" 42.instance_eval { eval methods }
C'est des choses puissantes. Merci.
Le problème avec la réponse d'Alfuken basé sur Eval est
a) eval est assez dangereux, bien que rapide p>
b) si vous avez un point supplémentaire (consécutif) pour une invocation de méthode comme celle-ci P>
Alors, qu'essayez-vous de montrer ici, l'espace supplémentaire entre le instance_val code> et le support
{ code>? Je suis confus.