Lazily evaluated table. For performance reasons, we sometimes return a custom table-like type instead of a native Lua table. This custom type lazily constructs the necessary Lua wrappers of the corresponding C++ objects, therefore preventing their unnecessary construction in some cases.

There are some notable consequences to the usage of a custom table type rather than the native Lua table type: Iterating a custom table is only possible using the pairs Lua function; ipairs won't work. Another key difference is that custom tables cannot be serialised into a game save file -- if saving the game would require serialisation of a custom table, an error will be displayed and the game will not be saved.

In previous versions of Factorio, this would create a LuaPlayer instance for every player in the game, even though only one such wrapper is needed. In the current version, accessing game.players by itself does not create any LuaPlayer instances; they are created lazily when accessed. Therefore, this example only constructs one LuaPlayer instance, no matter how many elements there are in game.players.
Custom tables may be iterated using pairs.
for _, p in pairs(game.players) do game.player.print(; end
The following will produce no output because ipairs is not supported with custom tables.
for _, p in ipairs(game.players) do game.player.print(; end  -- incorrect; use pairs instead
This statement will execute successfully and global.p will be useable as one might expect. However, as soon as the user tries to save the game, a "LuaCustomTable cannot be serialized" error will be shown. The game will remain unsaveable so long as global.p refers to an instance of a custom table.
global.p = game.players  -- This has high potential to make the game unsaveable
class LuaCustomTable - sort
operator [] :: Any [RW] Access an element of this custom table.
operator # :: uint [R] Number of elements in this table.
valid :: boolean [R] Is this object valid?
object_name :: string [R] The class name of this object.
help() → string All methods and properties that this object supports.
operator [] :: Any [Read-Write]

Access an element of this custom table.

operator # :: uint [Read-only]

Number of elements in this table.