是否有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)
对于这个特例:
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)
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)
| 归档时间: |
|
| 查看次数: |
1258 次 |
| 最近记录: |