Ruby:如何评估每个send命令的多个方法?

7 ruby metaprogramming

假设我有一个XML :: Element ...我想做类似的事情:

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

khe*_*lll 8

在你的情况下,最好使用 instance_eval

"Test".instance_eval{chop!.chop!} #=> "Te"
Run Code Online (Sandbox Code Playgroud)

并为您的代码:

my_xml_element.instance_eval{parent.next_sibling.next_sibling}
Run Code Online (Sandbox Code Playgroud)


bri*_*der 5

呃,如果我正确地理解他的问题,那并不是他所要求的.我的意思是发送一个字符串或一个符号作为arg,你的解决方案没有.我不认为有一个内置的方法可以做你想要的,但我用一个测试掀起了一个方法.

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
Run Code Online (Sandbox Code Playgroud)


Dan*_* S. 5

实际上,凯勒尔几乎是正确的。用这个:

methods_chain = "parent.next_sibling.next_sibling"
result = my_xml_element.instance_eval( eval methods_chain )
Run Code Online (Sandbox Code Playgroud)

这段代码比使用split()快20倍,并且允许您将带有args的链方法传递给该方法,如下所示:

methods = "power!(2).div(57).+(12).to_f"
42.instance_eval { eval methods }
Run Code Online (Sandbox Code Playgroud)