2 ms·
` t.__orderedIndex = nil` looks like it cleans up at the end of the iteration, am I missing something? Mutating a table while iterating over it is fairly hazard
by JonChesterfield 4y ago
` t.__orderedIndex = nil` looks like it cleans up at the end of the iteration, am I missing something? Mutating a table while iterating over it is fairly hazardous anyway
- lifthrasiir 4y agoAh, yeah, the problem won't be visible with a normal loop. However if you break out of the loop without hitting the very last key, or remove a key during the iteration [1], or loop against the same table inside another loop, then the snippet will fail in unexpected ways. The correct way to do this is as follows. First you collect all keys and sort them as usual, and then return an iterator function that contains those keys as an upvalue. Essentially you need to create a single-use `pairs` function that holds all necessary states. [1] You can't insert a key during the iteration, but removing an existing key is guaranteed to work correctly, no matter if you've already past the deleted key or not: https://www.lua.org/manual/5.4/manual.html#pdf-next https://www.lua.org/manual/5.4/manual.html#pdf-next