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"]
在这种情况下是否可能?
答案 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