我是否可以传递一个块,该块本身希望在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。由于我无法控制正在包装的进程的签名,因此无法使用此方法。总的来说,这似乎是一个很好的解决办法。