この質問は、 「キーが削除されている間に lua テーブルを安全に反復するにはどうすればよいですか」に似ていますが、明らかに異なります。
概要
Lua 配列 ( から始まる連続した整数であるキーを持つテーブル) が与えられた場合、この配列を反復処理してエントリの一部を削除する1
最良の方法は何ですか?
実際の例
Lua 配列テーブルにタイムスタンプ付きのエントリの配列があります。エントリは常に配列の末尾に追加されます ( を使用table.insert
)。
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
ときどきこのテーブルを (順番に) 実行し、特定のエントリを処理して削除する必要があります。
function processEventsBefore( timestamp )
for i,stamp in ipairs( timestampedEvents ) do
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
end
end
end
残念ながら、上記のコードのアプローチでは反復が中断され、一部のエントリがスキップされます。インデックスを手動で歩くよりも、これを行うためのより良い(タイピングは少ないが安全な)方法はありますか:
function processEventsBefore( timestamp )
local i = 1
while i <= #timestampedEvents do -- warning: do not cache the table length
local stamp = timestampedEvents[i]
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
else
i = i + 1
end
end
end