7
votes

RUBY: Comment évaluer plusieurs méthodes par commande d'envoi?

disons que j'ai un xml :: élément ... Je veux faire quelque chose comme:

my_xml_element.send ("parent.next_si_sible.next_sibling")


0 commentaires

5 Réponses :


8
votes

Dans votre cas, il est préférable d'utiliser instance_eval code> xxx pré>

et pour votre code: p>

my_xml_element.instance_eval{parent.next_sibling.next_sibling}


0 commentaires

5
votes

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


0 commentaires

1
votes

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"


1 commentaires

Désolé, cela ne fonctionnera pas en dehors du contexte des rails depuis l'objet # essayer n'est pas défini.



6
votes

En fait, Khelll a presque raison. Utilisez ceci:

methods = "power!(2).div(57).+(12).to_f"
42.instance_eval { eval methods }


1 commentaires

C'est des choses puissantes. Merci.



0
votes

Le problème avec la réponse d'Alfuken basé sur Eval est

a) eval est assez dangereux, bien que rapide

b) si vous avez un point supplémentaire (consécutif) pour une invocation de méthode comme celle-ci xxx


1 commentaires

Alors, qu'essayez-vous de montrer ici, l'espace supplémentaire entre le instance_val et le support {? Je suis confus.