如何在Ruby中动态调用Proc?

B A*_*B A 4 ruby

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

def s a
a + 1
end
b = "s"
send b.to_sym,10 #=> 11
Run Code Online (Sandbox Code Playgroud)

有这样的事吗?

p = Proc.new{|s| s + 1}
d = "p"
*call d.to_sym,10 *
Run Code Online (Sandbox Code Playgroud)

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

ss = ["a","b","c","d"] 
Run Code Online (Sandbox Code Playgroud)

在这种情况下是否可能?

Ser*_*sev 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
Run Code Online (Sandbox Code Playgroud)

  • @BA:这种方式是更好的方式. (2认同)
  • 我喜欢"民用级"红宝石这个词 (2认同)

Ale*_*kin 7

对于这个特例:

p = Proc.new{|s| s + 1}
d = "p"
#? *call d.to_sym,10 *
Run Code Online (Sandbox Code Playgroud)

这将是:

binding.local_variable_get(d).(10)
#? 11
Run Code Online (Sandbox Code Playgroud)

  • 局部变量和显式绑定使用**永远不是一个好方法**.@SergioTulentsev展示了正确的方法.再一次,按照Layman的说法:除非你按照塞尔吉奥的建议使用哈希,否则你做错了. (6认同)
  • @BA我看不到调用1 proc和许多procs之间的任何区别. (2认同)

roy*_*hri 5

更新

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

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

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

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

myprocs = {}
myprocs["d"] = Proc.new{|s| s + 1}
myprocs["d"].call(10)
Run Code Online (Sandbox Code Playgroud)