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:

-- Inicializar tabla
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

-- table simple
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
1table.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).

2table.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.

3table.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.)

4table.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.

5table.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

fruits = {"banana","orange","apple"}
-- 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

fruits = {"banana","orange","apple"}

-- 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

fruits = {"banana","orange","apple","grapes"}
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

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:

tbl 最大值:    34
tbl 长度     3

Nota:

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
Otras extensiones