Lua table (tabla)
table es una estructura de datos de Lua que nos ayuda a crear diferentes tipos de datos, como: arreglos, diccionarios, etc.
Lua table usa arreglos asociativos; puedes usar valores de cualquier tipo como índice del arreglo, pero ese valor no puede ser nil.
Lua table no tiene un tamaño fijo; puedes expandirla según sea necesario.
Lua también resuelve módulos (module), paquetes (package) y objetos (Object) mediante table. Por ejemplo, `string.format` indica usar `"format"` para indexar la table `string`.
Construcción de table (tabla)
El constructor es la expresión que crea e inicializa tablas. La tabla es una característica poderosa y exclusiva de Lua. El constructor más simple es `{}`, que se usa para crear una tabla vacía. Puedes inicializar directamente un arreglo:
mytable = {}
-- Especificar valor
mytable[1]= "Lua"
-- Eliminar referencia
mytable = nil
-- el recolector de basura de Lua liberará la memoria
Cuando establecemos elementos en la table a, y luego asignamos a a b, tanto a como b apuntan a la misma memoria. Si a se establece a nil, b aún puede acceder a los elementos de la table. Si no hay ninguna variable especificada apuntando a a, el mecanismo de recolección de basura de Lua limpiará la memoria correspondiente.
El siguiente ejemplo demuestra la situación descrita anteriormente:
Ejemplo
mytable = {}
print("El tipo de mytable es ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "Antes de modificar"
print("El elemento de mytable en el índice 1 es ", mytable[1])
print("El elemento de mytable en el índice wow es ", mytable["wow"])
-- alternatetable y mytable apuntan a la misma table
alternatetable = mytable
print("El elemento de alternatetable en el índice 1 es ", alternatetable[1])
print("El elemento de alternatetable en el índice wow es ", alternatetable["wow"])
alternatetable["wow"] = "Después de modificar"
print("El elemento de mytable en el índice wow es ", mytable["wow"])
-- Liberar variable
alternatetable = nil
print("alternatetable es ", alternatetable)
-- mytable todavía puede ser accedida
print("El elemento de mytable en el índice wow es ", mytable["wow"])
mytable = nil
print("mytable es ", mytable)
El resultado de ejecutar el código anterior es:
mytable 的类型是 table mytable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 alternatetable 索引为 1 的元素是 Lua alternatetable 索引为 wow 的元素是 修改前 mytable 索引为 wow 的元素是 修改后 alternatetable 是 nil mytable 索引为 wow 的元素是 修改后 mytable 是 nil
Operaciones con table
A continuación se enumeran los métodos comunes para operaciones con table:
| N.º | Método y uso |
|---|---|
| 1 | table.concat (table [, sep [, start [, end]]]): concat es la abreviatura de concatenate (encadenar, unir). La función table.concat() lista todos los elementos de la parte de arreglo de la table especificada en los parámetros, desde la posición start hasta la posición end, separados por el separador especificado (sep). |
| 2 | table.insert (table, [pos,] value): Inserta un elemento con valor value en la posición especificada (pos) de la parte de arreglo de la table. El parámetro pos es opcional; por defecto es el final de la parte de arreglo. |
| 3 | table.maxn (table) Devuelve el mayor valor de clave (key) entre todas las claves positivas de la table. Si no existe ningún elemento con clave positiva, devuelve 0. (Después de Lua 5.2, este método ya no existe; este artículo utiliza una función personalizada para implementarlo.) |
| 4 | table.remove (table [, pos]) Devuelve el elemento en la posición pos de la parte de arreglo de la table. Los elementos posteriores se mueven hacia adelante. El parámetro pos es opcional; por defecto es la longitud de la table, es decir, se elimina desde el último elemento. |
| 5 | table.sort (table [, comp]) Ordena la table dada en orden ascendente. |
A continuación, veamos ejemplos de estos métodos.
Concatenación de table
Podemos usar concat() para generar una cadena formada por la concatenación de los elementos de una lista:
Ejemplo
-- Devuelve la cadena concatenada de la table
print("Cadena concatenada: ",table.concat(fruits))
-- Especificar el carácter de concatenación
print("Cadena concatenada: ",table.concat(fruits,", "))
-- Especificar índice para concatenar la table
print("Cadena concatenada: ",table.concat(fruits,", ", 2,3))
El resultado de ejecutar el código anterior es:
连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
Inserción y eliminación
El siguiente ejemplo demuestra las operaciones de inserción y eliminación en table:
Ejemplo
-- Insertar al final
table.insert(fruits,"mango")
print("El elemento en el índice 4 es ",fruits[4])
-- Insertar en la clave con índice 2
table.insert(fruits,2,"grapes")
print("El elemento en el índice 2 es ",fruits[2])
print("El último elemento es ",fruits[5])
table.remove(fruits)
print("El último elemento después de eliminar es ",fruits[5])
El resultado de ejecutar el código anterior es:
索引为 4 的元素为 mango 索引为 2 的元素为 grapes 最后一个元素为 mango 移除后最后一个元素为 nil
Ordenación de table
El siguiente ejemplo demuestra el uso del método sort(), que se utiliza para ordenar la table:
Ejemplo
print("Antes de ordenar")
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("Después de ordenar")
for k,v in ipairs(fruits) do
print(k,v)
end
El resultado de ejecutar el código anterior es:
排序前 1 banana 2 orange 3 apple 4 grapes 排序后 1 apple 2 banana 3 grapes 4 orange
Valor máximo de table
table.maxn: después de Lua 5.2, este método ya no existe; hemos definido el método table_maxn para implementarlo.
El siguiente ejemplo demuestra cómo obtener el valor máximo en una table:
Ejemplo
local mn=nil;
for k, v in pairs(t) do
if(mn==nil) then
mn=v
end
if mn < v then
mn = v
end
end
return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("Valor máximo de tbl: ", table_maxn(tbl))
print("Longitud de tbl ", #tbl)
El resultado de ejecutar el código anterior es:
tbl 最大值: 34 tbl 长度 3
Otras extensionesNota:
Cuando obtenemos la longitud de una table, ya sea usando#otable.getnAmbos dejan de contar en el punto donde se interrumpe el índice, lo que impide obtener correctamente la longitud de la table.
Se puede usar el siguiente método en su lugar:
function table_leng(t) local leng=0 for k, v in pairs(t) do leng=leng+1 end return leng; end