warframe tutorial ropa programa nombre for lua

tutorial - ¿Cómo obtener el número de entradas en una tabla de Lua?



lua warframe (6)

Suena como una pregunta "déjame googleear para ti", pero de alguna manera no puedo encontrar una respuesta. El operador Lua # solo cuenta las entradas con claves enteras, y también lo hace table.getn :

tbl = {} tbl["test"] = 47 tbl[1] = 48 print(#tbl, table.getn(tbl)) -- prints "1 1" count = 0 for _ in pairs(tbl) do count = count + 1 end print(count) -- prints "2"

¿Cómo obtengo el número de todas las entradas sin contarlas?


Hay una forma, pero puede ser decepcionante: use una variable adicional (o uno de los campos de la tabla) para almacenar el recuento y aumente cada vez que realice una inserción.

count = 0 tbl = {} tbl["test"] = 47 count = count + 1 tbl[1] = 48 count = count + 1 print(count) -- prints "2"

No hay otra manera, el operador # solo funcionará en tablas tipo array con claves consecutivas.


La forma más fácil que conozco para obtener el número de entradas en una tabla es con ''#''. #tableName obtiene el número de entradas siempre que estén numeradas:

tbl={ [1] [2] [3] [4] [5] } print(#tbl)--prints the highest number in the table: 5

Lamentablemente, si no están numerados, no funcionará.


Parece que cuando los elementos de la tabla se agregan por el método insert, getn regresará correctamente. De lo contrario, tenemos que contar todos los elementos

mytable = {} element1 = {version = 1.1} element2 = {version = 1.2} table.insert(mytable, element1) table.insert(mytable, element2) print(table.getn(mytable))

Imprimirá 2 correctamente


Puede configurar una meta-tabla para realizar un seguimiento del número de entradas, esto puede ser más rápido que la iteración si esta información es necesaria con frecuencia.


Ya tiene la solución en la pregunta: la única forma es iterar toda la tabla con pairs(..) .

function tablelength(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end

Además, observe que la definición del operador "#" es un poco más complicada que eso. Permítanme ilustrarlo tomando esta tabla:

t = {1,2,3} t[5] = 1 t[9] = 1

De acuerdo con el manual, cualquiera de 3, 5 y 9 son resultados válidos para #t . La única manera sensata de usarlo es con arreglos de una parte contigua sin valores nulos.


local function CountedTable(x) assert(type(x) == ''table'', ''bad parameter #1: must be table'') local new_t = {} local mt = {} -- `all` will represent the number of both local all = 0 for k, v in pairs(x) do all = all + 1 end mt.__newindex = function(t, k, v) if v == nil then if rawget(x, k) ~= nil then all = all - 1 end else if rawget(x, k) == nil then all = all + 1 end end rawset(x, k, v) end mt.__index = function(t, k) if k == ''totalCount'' then return all else return rawget(x, k) end end return setmetatable(new_t, mt) end local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true } assert(bar.totalCount == 4) assert(bar.x == 23) bar.x = nil assert(bar.totalCount == 3) bar.x = nil assert(bar.totalCount == 3) bar.x = 24 bar.x = 25 assert(bar.x == 25) assert(bar.totalCount == 4)