0

我有一个非常不寻常的行为,其中 q.pop 的返回 obj 没有相应地更新。我将用伪代码演示......

q = Queue.new
insert unique objects into the q...

while !q.empty? do
    curr = q.pop
    req = Typhoeus::Request.new("someLegitURL")
    req.on_complete do |response|
        puts curr    #PROBLEM: same result every time!!!
    end
end

^在这里,我面临的问题是,当我“放置curr”时,对象每次都是一样的!

如果我用这样的数组替换相同的代码:

arr = Array.new
insert unique objects into the arr...

arr.each do |curr|
    ... same thing ...
        puts curr    # NOT A PROBLEM: different result every time
    ... same thing ...
end

^在这里,我实际上得到了“puts curr”的独特输出。

有没有人遇到过这样的问题?
对问题/解决方案有任何见解吗?
谢谢。

4

1 回答 1

1

问题解决了!我会回答我自己的问题,以防以后有人需要。

问题:Ruby 使用 while 循环极其不寻常的作用域。

在 Ruby 的 while 循环中,循环的每次迭代都不会终止。这就是我的意思

while true
    i = 10
    break
end
puts i    # this will actually print out 10

然而

loop do
    i = 10
    break
end
puts i    # raises error

简而言之:当我使用带有队列的 while 循环时,问题是前一个循环的迭代没有被“擦除”,从而影响了以后的迭代。

如有疑问,请使用循环,而不是 while。

于 2015-06-30T02:40:38.613 回答