Tipos de datos Lua
Lua es un lenguaje de tipado dinámico, las variables no necesitan definición de tipo, solo hay que asignarles un valor. Los valores pueden almacenarse en variables, pasarse como parámetros o devolverse como resultado.
En Lua hay 8 tipos básicos: nil, boolean, number, string, userdata, function, thread y table.
| Tipo de datos | Descripción |
|---|---|
| nil | Este es el más simple, solo el valor nil pertenece a esta clase, representa un valor no válido (equivalente a false en expresiones condicionales). |
| boolean | Contiene dos valores: false y true. |
| number | Representa números de coma flotante de doble precisión. |
| string | Las cadenas se representan con un par de comillas dobles o comillas simples. |
| function | Funciones escritas en C o Lua. |
| userdata | Representa cualquier estructura de datos de C almacenada en una variable. |
| thread | Representa una línea de ejecución independiente, utilizada para ejecutar corrutinas. |
| table | La tabla (table) en Lua es en realidad un "array asociativo" (associative arrays), cuyos índices pueden ser números, cadenas o tipos de tabla. En Lua, la creación de tablas se realiza mediante "expresiones de construcción"; la expresión de construcción más simple es {}, que se usa para crear una tabla vacía. |
Podemos usar la función type para comprobar el tipo de una variable o valor dado:
Ejemplo
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
nil (nulo)
El tipo nil representa un valor sin ningún valor válido, solo tiene un valor -- nil. Por ejemplo, al imprimir una variable sin asignar, se mostrará un valor nil:
> print(type(a)) nil >
Para variables globales y tablas, nil también tiene un efecto de "eliminación". Asignar nil a una variable global o a una variable dentro de una tabla equivale a eliminarlas. Ejecute el siguiente código para verlo:
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
Al comparar nil, se deben usar comillas dobles":
nil
> type(X)==nil
false
> type(X)=="nil"
true
>
type(X)==nilEl resultado esfalseLa razón es que type(X) en realidad devuelve"nil"una cadena, es un tipo string:
type(type(X))==string
boolean (booleano)
El tipo boolean solo tiene dos valores posibles: true (verdadero) y false (falso). Lua considera false y nil como false, los demás son true, y el número 0 también es true:
Ejemplo
print(type(false))
print(type(nil))
if false or nil then
print("Al menos uno es true")
else
print("false y nil son ambos false")
end
if 0 then
print("El número 0 es true")
else
print("El número 0 es false")
end
El resultado de ejecutar el código anterior es el siguiente:
$ lua test.lua boolean boolean nil false 和 nil 都为 false 数字 0 是 true
number (número)
Lua tiene por defecto un solo tipo number -- tipo double (doble precisión) (el tipo predeterminado se puede modificar en la definición en luaconf.h). Las siguientes formas se consideran tipo number:
Ejemplo
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
El resultado de ejecutar el código anterior:
number number number number number number
string (cadena)
Las cadenas se representan con un par de comillas dobles o comillas simples.
string1 = "this is string1" string2 = 'this is string2'
También se pueden usar dos corchetes '[[]]' para representar una cadena en bloque.
Ejemplo
<html>
<head></head>
<body>
<a href="http://www.example.com/">Tutorial de Ejemplo</a>
</body>
</html>
]]
print(html)
El resultado de ejecutar el siguiente código es:
<html>
<head></head>
<body>
<a href="../index.html">Ejemplo</a>
</body>
</html>
Al realizar operaciones aritméticas sobre una cadena numérica, Lua intenta convertir esa cadena numérica en un número:
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: in ?
>
En el código anterior, "error" + 1 produce un error. La concatenación de cadenas se realiza con .., por ejemplo:
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>
Usa # para calcular la longitud de una cadena, colocándolo delante de la cadena, como en el siguiente ejemplo:
Ejemplo
> print(#len)
14
> print(#"www.example.com")
14
>
table (tabla)
En Lua, la creación de tablas se realiza mediante "expresiones de construcción"; la expresión de construcción más simple es {}, que se usa para crear una tabla vacía. También se pueden agregar algunos datos en la tabla e inicializarla directamente:
Ejemplo
local tbl1 = {}
-- Inicializar la tabla directamente
local tbl2 = {"apple", "pear", "orange", "grape"}
La tabla (table) en Lua es en realidad un "array asociativo" (associative arrays), y los índices del array pueden ser números o cadenas.
Ejemplo
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
El resultado de ejecutar el script es:
$ lua table_test.lua key : value 10 : 33
A diferencia de los arrays en otros lenguajes que usan 0 como índice inicial, en Lua el índice inicial predeterminado de una tabla generalmente comienza en 1.
Ejemplo
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
print("Key", key)
end
El resultado de ejecutar el script es:
$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4
Una tabla no tiene un tamaño fijo; cuando se agregan nuevos datos, la longitud de la tabla crece automáticamente. Las tablas sin inicializar son nil.
Ejemplo
a3 = {}
for i = 1, 10 do
a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])
El resultado de ejecutar el script es:
$ lua table_test3.lua val nil
function (función)
En Lua, las funciones se consideran "valores de primera clase" (First-Class Value), y las funciones pueden almacenarse en variables:
Ejemplo
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
El resultado de ejecutar el script es:
$ lua function_test.lua 120 120
Las funciones pueden pasarse como parámetros en forma de funciones anónimas (anonymous function):
Ejemplo
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)-- Función anónima
return key.."="..val;
end
);
El resultado de ejecutar el script es:
$ lua function_test2.lua key1=val1 key2=val2
thread (hilo)
En Lua, el hilo principal es la corrutina (coroutine). Es similar a un hilo (thread), tiene su propia pila, variables locales y puntero de instrucciones, y puede compartir variables globales y la mayoría de las demás cosas con otras corrutinas.
La diferencia entre hilos y corrutinas: varios hilos pueden ejecutarse simultáneamente, mientras que una corrutina solo puede ejecutarse una a la vez, y una corrutina en ejecución solo se detiene cuando es suspendida (suspend).
userdata (tipo personalizado)
userdata es un dato definido por el usuario, utilizado para representar un tipo creado por la aplicación o por bibliotecas de C/C++. Puede almacenar datos de cualquier tipo de dato de C/C++ (generalmente structs y punteros) en variables de Lua para su invocación.
Otras extensiones