我想捕获块(具有关联的名称),但它们的写入范围没有任何改变。下面的代码有两种捕获块的方法(capt_a
和capt_b
)。 capt_a
正常工作,我想capt_b
以同样的方式工作。是否可以修改capt_b
以便与capt_a
的效果相同?更改红宝石中捕获的块的范围
class Capturer
attr_reader :method, :block
def capt_a
yield self
self
end
def capt_b(&block)
instance_eval(&block)
self
end
def method_missing(method, &block)
@method = method
@block = block
end
end
# Example:
a = Capturer.new.capt_a{|capt| capt.foo{self} }.block
b = Capturer.new.capt_b{ foo{self} }.block
a.call # => main
b.call # => #<Capturer:0x000001008fb5c8 @method=:foo, @block=#<Proc:[email protected]:23>>
# I would like 'main'
我的代码只是一个例子;这不仅仅是“自我”,而是我想要恢复的整个背景。 – 2012-01-18 02:25:26
在我上面的例子中,调用'm.instance_eval do ...'会“恢复”该上下文。你是这个意思吗?你也可以找到Binding类的使用。 http://extensions.rubyforge.org/rdoc/classes/Binding.html#M000022我刚刚碰到它。 – bioneuralnet 2012-01-18 02:36:08
事实上,执行'instance_eval'应该(或多或少)恢复正确的上下文。我已发布解决方案,显示这一点。谢谢 – 2012-01-18 03:04:38