0

q.pop の戻りオブジェクトがそれに応じて更新されないという非常に異常な動作をしています。疑似コードでデモンストレーションします...

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 を置く」とき、オブジェクトが毎回同じであることです!

SAME コードを次のような配列に置き換えると:

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 ではなく loop を使用してください。

于 2015-06-30T02:40:38.613 に答える