Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以传递一个块,该块本身希望在ruby?中执行一个块;_Ruby_Block_Proc - Fatal编程技术网

我是否可以传递一个块,该块本身希望在ruby?中执行一个块;

我是否可以传递一个块,该块本身希望在ruby?中执行一个块;,ruby,block,proc,Ruby,Block,Proc,我期待代码 foo=proc{puts "foo"} instance_exec(1,2,3,&foo) do |*args , &block| puts *args block.call puts "bar" end 输出 1 2 3 foo bar 1. 2. 3. 福 酒吧 但是我犯了错误 both block arg and actual block given 给出了块arg和实际块 我可以传递一个本身希望在ruby中执行的块吗?&foo尝试将foo作为

我期待代码

foo=proc{puts "foo"}

instance_exec(1,2,3,&foo) do |*args , &block|
  puts *args
  block.call
  puts "bar"
end
输出

1 2 3 foo bar 1. 2. 3. 福 酒吧 但是我犯了错误

both block arg and actual block given 给出了块arg和实际块
我可以传递一个本身希望在ruby中执行的块吗?

&foo
尝试将
foo
作为块传递给
instance\u exec
,而您已经传递了一个显式块。省略符号并发送
foo
,就像发送任何其他参数一样(除了它是
Proc
实例)。因此,请尝试以下方法:

instance_exec(1,2,3,foo) do |*args, block|
  puts *args
  block.call
  puts "bar"
end
这也意味着您可以执行以下操作:

bar = proc{ |*args, block|
  puts *args
  block.call
  puts "bar"
}

instance_exec(1,2,3,foo,&bar)
得到同样的结果


更多信息请访问

我参加这次聚会晚了大约3年,但我想我会分享一种方法,让你把内心的积木更像是一个真正的积木,而不仅仅是一个简单的老论点

我所知道的最好的方法是创建一个对象作为绑定上下文,并将外部块定义为方法。因此,如果我重写原始示例,如下所示,而不使用instance_exec调用

inner_proc = proc { puts "inner" }
outer_proc = proc { |*args, &inner_block|
  puts *args
  inner_block.call
  puts "bar"
}
我们可以将
outer\u proc
定义为对象上的方法

scope_object = Object.new
scope_object.define_singleton_method :bound_proc, &outer_proc
现在您可以调用
scope\u object.bound\u proc
,而不是上面的
instance\u exec
调用

scope_object.bound_proc 1, 2, 3, &inner_proc
您将获得:

1
2
3
inner
bar

不幸的是,如果您试图在
outer\u proc
的内部而不是
internal\u块中进行调用,则会出现LocalJumpError,我不完全确定原因。如果有人有这个答案,我会感兴趣的。

不幸的是,这对我的案例不起作用。我试图以一种允许我跟踪其执行时间的方式透明地包装现有的proc。由于我无法控制正在包装的进程的签名,因此无法使用此方法。总的来说,这似乎是一个很好的解决办法。