假设我有一个XML :: Element ...我想做类似的事情:
my_xml_element.send( "parent.next_sibling.next_sibling")
在你的情况下,最好使用 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)
呃,如果我正确地理解他的问题,那并不是他所要求的.我的意思是发送一个字符串或一个符号作为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)
实际上,凯勒尔几乎是正确的。用这个:
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)
| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |