El tipo de dato tabla puede almacenar múltiples valores de cualquier tipo que no sea nil, incluidos booleanos, números, cadenas, funciones y otras tablas. Construye tablas con llaves ({}):
-- Construir una tabla vacía asignada a la variable "t"local t = {}print(t) -- {}
Puedes usar una tabla como un array o un diccionario. Los arrays utilizan una lista ordenada de números como índices, pero los diccionarios pueden tener números, cadenas y objetos como índices.
Para más información sobre las funciones incorporadas para trabajar con tablas, consulta la biblioteca table.
Arrays
Un array es una lista ordenada de valores. Los arrays son útiles para almacenar colecciones de datos, como un grupo de jugadores con permisos especiales.
Crear arrays
Para crear un array usando una tabla Luau, declara los valores en orden secuencial, separados por comas.
-- Construir un array con tres elementoslocal testArray = {"Una cadena", 3.14159, true}print(testArray)
Leer desde arrays
Para leer de un array, añade un par de corchetes después de su referencia y especifica el número de índice del elemento dentro de ([pos]):
-- Construir un array con tres elementoslocal testArray = {"Una cadena", 3.14159, true}print(testArray[1]) -- Una cadenaprint(testArray[2]) -- 3.14159print(testArray[3]) -- true
Escribir en arrays
Para definir o reescribir el valor de un array en un índice, declara el número de índice en corchetes ([index]) seguido de = y el valor:
local testArray = {"Una cadena", 3.14159, true}testArray[2] = 12345testArray[4] = "Nueva cadena"print(testArray[2]) --12345print(testArray[4]) -- Nueva cadena
Iterar sobre arrays
Para iterar sobre un array, puedes usar un bucle for. Debido a que los arrays tienen índices numéricos, también puedes usar un bucle for numérico desde 1 hasta la longitud del array (#array).
local testArray = {"Una cadena", 3.14159, true, "Nueva cadena"}-- Bucle usando iteración generalfor index, value in testArray doprint(index, value)end-- Iterar usando el operador de longitud del array (#)for index = 1, #testArray doprint(index, testArray[index])end
Insertar elementos
Hay dos formas incorporadas de insertar un elemento al final de un array:
- Pasar una referencia al array y el valor del elemento a la función table.insert().
- Agregar el nuevo elemento al array usando la sintaxis array[#array+1].
local testArray = {"Una cadena", 3.14159}table.insert(testArray, "Nueva cadena")testArray[#testArray+1] = "Otra nueva cadena"print(testArray[3]) -- Nueva cadenaprint(testArray[4]) -- Otra nueva cadena
Para insertar un elemento entre el inicio y el final de un array, incluye un valor de posición como el segundo argumento de table.insert(). Esto inserta el nuevo elemento y empuja los siguientes elementos un índice hacia arriba.
local testArray = {"Primer elemento", "Siguiente elemento"}table.insert(testArray, 2, "NUEVO ELEMENTO #2")print(testArray[1]) -- Primer elementoprint(testArray[2]) -- NUEVO ELEMENTO #2print(testArray[3]) -- Siguiente elemento
Eliminar elementos
Para eliminar un elemento de un array, usa table.remove(). Esto elimina el elemento en la posición especificada y mueve cualquier elemento siguiente un índice hacia atrás.
local testArray = {"Primer elemento", "Siguiente elemento", "Último elemento"}table.remove(testArray, 2)print(testArray[1]) -- Primer elementoprint(testArray[2]) -- Último elemento
Diccionarios
Los diccionarios son una extensión de los arrays. Los diccionarios almacenan un conjunto de pares clave-valor, donde las claves pueden ser cualquier número, cadena u objeto.
Crear diccionarios
Para crear una tabla diccionario, define cada clave seguida de = y el valor. Separa cada par clave-valor con una coma:
local testDictionary = {fruitName = "Limón",fruitColor = "Amarillo",sour = true}
Las claves para los diccionarios pueden ser números, cadenas y objetos. Por ejemplo, una clave también puede ser un Instance. Para usar objetos como claves, declara la clave entre corchetes ([key]):
local part = Instance.new("Part")local testDictionary = {partType = "Bloque",[part] = true}
Leer desde diccionarios
Para leer desde un diccionario, añade un par de corchetes después de su referencia y especifica el nombre de la clave. Referencia directamente una clave de cadena usando (["key"]) o (.key), o usa un valor variable ([key]).
local part = Instance.new("Part")local testDictionary = {partType = "Bloque",[part] = true}-- Incluye comillas para claves de cadenaprint(testDictionary["partType"]) -- Bloque-- O usa . para indexar claves de cadena sin espaciosprint(testDictionary.partType) -- Bloque-- Omitir comillas para claves no de cadenaprint(testDictionary[part]) -- true
Escribir en diccionarios
Para definir o reescribir el valor de una clave de diccionario nueva o existente, declara el nombre de la clave entre corchetes ([key]) o, si la clave es una cadena, usa (.key) seguido de = y el valor:
local testDictionary = {fruitName = "Limón",sour = true}-- Cambiar el valor de las claves existentestestDictionary["fruitName"] = "Cereza"testDictionary.sour = false-- Insertar un nuevo par clave-valortestDictionary.fruitCount = 10print(testDictionary.fruitName) -- Cerezaprint(testDictionary.sour) -- falseprint(testDictionary.fruitCount) -- 10
Iterar sobre diccionarios
Para iterar sobre un diccionario, usa un bucle for:
local testDictionary = {fruitName = "Limón",fruitColor = "Amarillo",sour = true}for key, value in testDictionary doprint(key, value)end--[[ Salida resultante:fruitName Limónsour truefruitColor Amarillo]]
Eliminar pares clave-valor
Para eliminar o borrar un par clave-valor de un diccionario, establece su valor para una clave a nil.
local testDictionary = {fruitName = "Limón",fruitColor = "Amarillo",sour = true}testDictionary.sour = nilfor key, value in testDictionary doprint(key, value)end--[[ Salida resultante:fruitName LimónfruitColor Amarillo]]
Tablas como referencias
Si almacenas una tabla en una nueva variable, Luau no crea una copia de esa tabla. En su lugar, la variable se convierte en una referencia, o puntero, a la tabla original. Cualquier referencia a una tabla refleja cualquier cambio en la tabla original:
local originalArray = {10, 20}local arrayReference = originalArrayprint("Original:", originalArray[1], originalArray[2])print("Referencia:", arrayReference[1], arrayReference[2])-- Cambiar valores en el array originaloriginalArray[1] = 1000originalArray[2] = 2000print("Referencia:", arrayReference[1], arrayReference[2])--[[ Salida resultante:Original: 10 20Referencia: 10 20Referencia: 1000 2000]]
Clonar tablas
Clones superficiales
Para copiar una tabla sin ninguna tabla anidada, Luau ofrece el método table.clone().
local original = {key = "valor",engine = "Roblox",playerID = 505306092}local clone = table.clone(original)
Clones profundos
Para copiar una tabla más compleja con tablas anidadas dentro de ella, necesitarás usar una función recursiva similar a la siguiente:
-- La función utilizada para clonar profundamente una tabla
local function deepClone(original)
-- Definir la nueva tabla para la copia
local clone = table.clone(original)
-- Iterar a través de la tabla original para buscar valores de tabla
-- Si se encuentra una tabla como valor, clónala profundamente a la clave (índice)
for key, value in original do
if type(value) == "table" then
clone[key] = deepClone(value)
end
end
-- Devolver la copia finalizada de la tabla clonada profundamente
return clone
end
Con la función en su lugar, puedes hacer una copia profunda de la siguiente manera:
local original = {key = "valor",playerInfo = {playerID = 505306092,playerName = "NombreJugador"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepClone(original)
Congelar tablas
Congelar una tabla la convierte en de solo lectura, lo cual es útil para crear valores constantes que no deseas cambiar. La congelación es permanente; no hay método "descongelar" o "descongelar". Para verificar si una tabla está congelada, usa table.isfrozen().
Congelaciones superficiales
Para congelar una tabla sin ninguna tabla anidada, Luau ofrece el método table.freeze().
local target = {key = "valor",engine = "Roblox",playerID = 505306092}table.freeze(target)target.playerID = 1 --> intento de modificar una tabla de solo lectura
Congelaciones profundas
Para congelar una tabla más compleja con tablas anidadas dentro de ella, usa una función recursiva similar a la siguiente:
local function deepFreeze(target)
-- Congelar superficialmente la tabla
table.freeze(target)
-- Verificar cada clave de la tabla y congelarla si es una tabla
for _, value in target do
-- Asegúrate de que el valor no esté congelado; si ya lo está, ocurrirá un error
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(value)
end
end
end
Con la función en su lugar, puedes congelar profundamente una tabla de la siguiente manera:
local target = {key = "valor",playerInfo = {playerID = 505306092,playerName = "NombreJugador"},otherInfo = {{{1, 3, 5, 7, 9}}}}deepFreeze(target)target.playerInfo.playerID = 1 --> intento de modificar una tabla de solo lectura