在下面的代码中,我从redis队列中读取并在redis操作完成时触发本地可延迟变量d
上的回调。
它工作正常,但我希望得到一个错误,因为当方法f
返回时,变量d
超出了范围。或者是吗?
为什么这样做?是因为使用d
的块创建闭包而这些闭包使d
保持活着?
require 'em-hiredis'
def f
d = EM::DefaultDeferrable.new
EM::Hiredis.connect.blpop('abcdef', 5).
callback {|x| d.succeed x}.
errback {|e| d.fail e}
d.
callback {|x| puts "value=#{x}"}.
errback {|e| puts "error #{e}"}
return nil
end
EM.run {f}
编辑:请注意EM :: Hiredis实例也是本地的,并且块附加到它。当f返回时,这些块不应该与redis连接一起消失吗?
答案 0 :(得分:0)
Ruby块很有意思,因为它们包含对它们在其中定义的范围的绑定。
这意味着你的deferrable被绑定在块中并可用于块,即使块在其他地方/之后执行也是如此。