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

Ruby:如何评估每个send命令的多个方法?,ruby,metaprogramming,Ruby,Metaprogramming,假设我有一个XML::元素……我想做一些类似的事情: my_xml_element.send(“parent.next_sibling.next_sibling”)在您的情况下,最好使用instance\u eval "Test".instance_eval{chop!.chop!} #=> "Te" 对于您的代码: my_xml_element.instance_eval{parent.next_sibling.next_sibling} 呃,如果我理解正确的话,那不是他真正想要的。

假设我有一个XML::元素……我想做一些类似的事情:


my_xml_element.send(“parent.next_sibling.next_sibling”)

在您的情况下,最好使用
instance\u eval

"Test".instance_eval{chop!.chop!} #=> "Te"
对于您的代码:

my_xml_element.instance_eval{parent.next_sibling.next_sibling}

呃,如果我理解正确的话,那不是他真正想要的。我的意思是send接受字符串或符号作为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
要求“测试/单元”
课例
def多_发送(str)
str.split('.').injection(self){| klass,method | klass.send(method)}
结束
结束
类MyTest
我认为问题在于,您专门将一系列方法定义为字符串,并且希望在某个对象上调用它,对吗

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"

事实上,凯勒几乎是对的。 使用以下命令:

methods_chain = "parent.next_sibling.next_sibling"
result = my_xml_element.instance_eval( eval methods_chain )
此代码比使用split()快20倍,并允许您使用args传递链方法,如下所示:

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

Alfuken基于eval的答案的问题是

A) eval虽然速度很快,但相当不安全

B) 如果像这样的方法调用有一个额外的(连续的)点

"example".instance_eval{eval "chop!..chop!"}.class
=> "examp".."examp"

"example".instance_eval {eval "chop!..chop!"}.class
=> Range # this is not what is desired

很抱歉,这在Rails的上下文之外实际上不起作用,因为对象#try没有定义。那么,您想在这里显示什么,
实例_val
{
括号之间的额外空间?我很困惑。这是强大的东西。谢谢。