【发布时间】:2013-02-27 17:15:42
【问题描述】:
我期待代码
foo=proc{puts "foo"}
instance_exec(1,2,3,&foo) do |*args , &block|
puts *args
block.call
puts "bar"
end
输出
1 2 3 富 酒吧但是出错了
块 arg 和给定的实际块我可以将一个本身期望一个块的块传递给 ruby 中的 instance_exec 吗?
【问题讨论】:
我期待代码
foo=proc{puts "foo"}
instance_exec(1,2,3,&foo) do |*args , &block|
puts *args
block.call
puts "bar"
end
输出
1 2 3 富 酒吧但是出错了
块 arg 和给定的实际块我可以将一个本身期望一个块的块传递给 ruby 中的 instance_exec 吗?
【问题讨论】:
&foo 尝试将foo 作为块传递给instance_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_proc定义为对象上的方法
scope_object = Object.new
scope_object.define_singleton_method :bound_proc, &outer_proc
现在您可以拨打scope_object.bound_proc,而不是上面的instance_exec。
scope_object.bound_proc 1, 2, 3, &inner_proc
你会得到:
1
2
3
inner
bar
不幸的是,如果您尝试在outer_proc 内部而不是inner_block.call 内部屈服,您将得到一个LocalJumpError,我不完全确定为什么。如果有人有这个答案,那么我会很感兴趣。
【讨论】: