我想捕獲塊(具有關聯的名稱),但它們的寫入範圍沒有任何改變。下面的代碼有兩種捕獲塊的方法(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