如何将字符串eval / constantize到方法,然后将参数传递给它

时间:2011-09-29 01:06:46

标签: ruby-on-rails ruby metaprogramming

假设:

s = "foo_bar_path"

我如何评估或限制s,并将参数传递给它,例如我的最终结果将等同于:

foo_bar_path(@myvar, @foobar)

我正在尝试eval(s).send,但这似乎不起作用。 constantize似乎只适用于Classes?

2 个答案:

答案 0 :(得分:11)

您只需在适当的对象上使用send method(或public_send,具体取决于您的需求):

some_object.send(s, @myvar, @foobar)

或者如果你想自己调用一个方法:

self.send(s, @myvar, @foobar)

文档说“符号”,但send同样乐于在字符串中获取方法名称。

答案 1 :(得分:2)

另一种解决此类问题的方法(对OpenStruct更好):

#for more in this domain, see the Ruby core API for the Object class
class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
m = k.method(:hello)
m.call   #=> "Hello, @iv = 99"