English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

table (tabla) de Lua

La tabla es un tipo de estructura de datos en Lua que nos ayuda a crear diferentes tipos de datos, como: arrays, diccionarios, etc.

La tabla de Lua utiliza un array asociativo, puede usar cualquier tipo de valor como índice del array, pero este valor no puede ser nil.

La tabla de Lua no tiene un tamaño fijo, puede ampliarla según sus necesidades.

Lua también resuelve módulos (module), paquetes (package) y objetos (Object) a través de tablas. Por ejemplo, string.format indica que se utiliza "format" para indexar table string.

Construcción de table (tabla)

El constructor es una expresión para crear e inicializar una tabla. La tabla es una función especial poderosa de Lua. La función constructor más simple es {}, que se utiliza para crear una tabla vacía. Puede inicializar un array directamente:

-- Inicializar tabla
mytable = {}
-- Especificar valor
mytable[1}
-- Remover referencias
mytable = nil
-- La recolección de basura de Lua liberará la memoria

Cuando establecemos elementos en table a y luego asignamos a a b, tanto a como b apuntan al mismo espacio de memoria. Si a se establece como nil Si b puede acceder a los elementos de table, entonces también puede hacerlo. Si no hay una variable especificada para a, el mecanismo de recolección de basura de Lua limpiará la memoria correspondiente.

El siguiente ejemplo demuestra la situación descrita anteriormente:

-- table simple
mytable = {}
print("El tipo de mytable es ", type(mytable))
mytable[1}
mytable["wow"] = "modificado"
print("El índice mytable es 1 es ", mytable[1)]
print("El elemento en la posición wow de mytable es ", mytable["wow"])
-- alternatetable y mytable se refieren al mismo table
alternatetable = mytable
print("El índice alternatetable es 1 es ", alternatetable[1)]
print("El elemento en la posición wow de mytable es ", alternatetable["wow"])
alternatetable["wow"] = "modificado"
print("El elemento en la posición wow de mytable es ", mytable["wow"])
-- Liberar variables
alternatetable = nil
print("alternatetable es ", alternatetable)
-- mytable aún se puede acceder
print("El elemento en la posición wow de mytable es ", mytable["wow"])
mytable = nil
print("mytable es ", mytable)

El resultado de la ejecución del código anterior es:

El tipo de mytable es nil, table
El índice mytable es 1 es nil, Lua
El elemento en la posición wow de mytable es nil, antes de la modificación
El índice alternatetable es 1 es nil, Lua
El elemento en la posición wow de mytable es nil, antes de la modificación
El elemento en la posición wow de mytable es nil, después de la modificación
alternatetable es nil
El elemento en la posición wow de mytable es nil, después de la modificación
mytable es nil

Operación de Table

A continuación se enumeran los métodos más comunes para la operación de Table:

Número de ordenMétodo & Propósito
1table.concat (table [, sep [, start [, end]]]):

concat es la abreviatura de concatenate (enlazar, conectar). La función table.concat() enumera todos los elementos del array especificado por table desde la posición start hasta la posición end, separados por el separador especificado (sep).

2table.insert (table, [pos,] value):

Insertar un elemento de valor value en la posición (pos) del array parte del table. El parámetro pos es opcional, por defecto es el final del array parte.

3table.maxn (table)

Especificar el valor clave más grande de todos los valores clave positivos del table. Si no existe ningún elemento con clave positiva, se devuelve 0. (Lua5.2Después de esto, este método ya no existe, en este artículo se utiliza una función personalizada.)

4table.remove (table [, pos])

Devuelve una parte del array de table ubicada en la posición pos. Los elementos posteriores se desplazarán. El parámetro pos es opcional, por defecto es la longitud de table, es decir, desde el último elemento.

5table.sort (table [, comp])

Ordenar el table dado en orden ascendente.

Ahora veamos algunos ejemplos de estos métodos.

Conexión de Table

Podemos usar concat() para output una cadena que conecta los elementos de una lista:

fruits = {"banana","orange","apple"}
-- retorna la cadena conectada de table
print("La cadena conectada ",table.concat(fruits))
-- especificar el carácter de conexión
print("La cadena conectada ",table.concat(fruits,", "))
-- conectar especificando el índice table
print("La cadena conectada ",table.concat(fruits,", ", 2,3))

El resultado de ejecutar el código anterior es:

La cadena conectada ",bananaorangeapple
La cadena conectada ",banana, orange, apple
La cadena conectada ",orange, apple

Inserción y eliminación

El siguiente ejemplo muestra las operaciones de inserción y eliminación de table:

fruits = {"banana","orange","apple"}
-- insertar al final
table.insert(fruits,"mango")
print("Índice de 4 El elemento es ",fruits[4)]
-- en la posición de índice 2 insertar en la posición clave
table.insert(fruits,2,"uvas")
print("Índice de 2 El elemento es ",fruits[2)]
print("El último elemento es ",fruits[5)]
table.remove(fruits)
print("El último elemento después de la eliminación es ",fruits[5)]

El resultado de ejecutar el código anterior es:

Índice de 4 El elemento es mango
Índice de 2 Los elementos son uvas
El último elemento es mango
El último elemento después de la eliminación es nil

Table ordenación

El siguiente ejemplo muestra el uso del método sort(), utilizado para ordenar una tabla:

fruits = {"banana", "orange", "apple", "grapes"}
print("Antes de ordenar")
for k, v in ipairs(fruits) do
        print(k, v)
end
table.sort(fruits)
print("Ordenado")
for k, v in ipairs(fruits) do
        print(k, v)
end

El resultado de ejecutar el código anterior es:

Antes de ordenar
1    banana
2    orange
3    apple
4    grapes
Ordenado
1    apple
2    banana
3    grapes
4    orange

Valor máximo de la tabla

table.maxn en Lua5.2 Este método ya no existe, por lo que hemos definido el método table_maxn para implementarlo.

El siguiente ejemplo muestra cómo obtener el valor máximo de una table:

function table_maxn(t)
  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:

Valor máximo de tbl:    34
Longitud de tbl     3

Nota:

Cuando obtenemos la longitud de una table, ya sea usando # o table.getn, ambos detendrán la cuenta en el punto de interrupción del índice, lo que lleva a que no se pueda obtener correctamente la longitud de la table.

Se puede utilizar 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