2017-08-05 12 views
2

2次元ゲームでオブジェクトを追跡するために複数のリストがありますが、これらのオブジェクトが画面外に出る場合は、私が下にあるものは私のために働くが、これは他の言語では機能しない。通常、私は破棄したいオブジェクトを保存してから、それらを削除するために再度ループする別の「破壊リスト」を作成する必要があります。リストからオブジェクトを削除することはできません。Ruby:そのオブジェクトでリストをループしている間にオブジェクトを削除する

これを実行しているときにRubyが目に見えるグリッチを表示していないか、または繰り返している間にリストから複数のオブジェクトを削除すると、Rubyの配列が異なって動作しますか?

objects = [] 

objects.each{|o| o.withinBounds ? o.update : objects.delete(o)} 

答えて

5

ルビーでは、あなたが何を言っているのか実際には不具合があります。

objects = [1,2,3,4] 
objects.each { |el| objects.delete(el) } 
=> [2, 4] 

あなたは結果は空の配列であることを期待するではなく、次のとおりです。

はこれを試してみてください。 arreachの要素が混乱しています。 は、配列の長さが変更されたため、が混乱しています。各イテレータは擬似コードでこのようなものになります。

だから、
count = 0 
while length(objects) > count 
    yield objects[count] 
    count + 1 
end 

を、私は上記の例では、我々は[2, 4]を取得する理由は何をしているかobjects.each { |el| objects.delete(el) }上の段階の分析により、段差に説明することができます。

  1. 4(オブジェクトの長さ)> 0で始まります。
  2. 番号1が生成され、削除されます。
  3. カウント= 1
  4. 3(オブジェクトの長さ)> 1つの
  5. 番号3を得、削除されています。
  6. 数= 2
  7. 2(オブジェクトの長さは)我々が行って、私たちは、あなたがしようとしているものを行うには良い方法はあり[2, 4]

を持っている、でされている

  • を数えるよりも大きいではありませんdelete_ifを使用:

    new_objects = objects.delete_if {|o| o.withinBounds } 
    
  • 関連する問題