如何在Ruby中动态调用Proc?

时间:2016-11-29 12:08:30

标签: ruby

proc是否有一个等效的method.send? 例如:

def s a
a + 1
end
b = "s"
send b.to_sym,10 #=> 11

有类似的东西吗?

p = Proc.new{|s| s + 1}
d = "p"
*call d.to_sym,10 *

编辑: 回应mudasobwa的回答 我需要从一系列方法中调用Procs。 例如:

ss = ["a","b","c","d"] 

在这种情况下是否可能?

4 个答案:

答案 0 :(得分:14)

其他答案涵盖提出的确切问题。但我说,这是一种错误的做法。不要进行运行时内省。它没有带来任何好处。如果你想通过名字来处理你的过程,把它们放在哈希中并使用"民用等级"红宝石。

handlers = {
  'process_payment' => proc { ... },
  'do_this' => proc { ... },
  'or_maybe_that' => proc { ... },
}

pipeline = ['process_payment', 'or_maybe_that']

pipeline.each do |method_name|
  handlers[method_name].call
end

答案 1 :(得分:7)

对于这个特例:

p = Proc.new{|s| s + 1}
d = "p"
#⇒ *call d.to_sym,10 *

这将是:

binding.local_variable_get(d).(10)
#⇒ 11

答案 2 :(得分:5)

更新

Procs是对象,因此您可以将它们存储在变量,数组,散列中,就像任何对象一样,并从那些对象而不是名称中调用它们。

如果需要创建一个proc数组,请将procs自己存储在一个数组中,而不是将它们分配给它们的变量的名称。这样,您可以传递此数组并将其全部调用。

myprocs = []
myprocs << = Proc.new{|s| s + 1}
myprocs.each {|p| p.call(10)}

如果要通过名称调用它们,请使用哈希值。

myprocs = {}
myprocs["d"] = Proc.new{|s| s + 1}
myprocs["d"].call(10)

答案 3 :(得分:0)

使用eval - 不好的做法,但作为可能的解决方案之一是:

p = Proc.new{|s| s + 1}
d = "p"
eval("#{d}[10]")
#=> 11