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

Tipos de datos de Lua

Lua es un lenguaje de tipo dinámico, no es necesario definir el tipo de variable, solo necesita asignar un valor a la variable. Los valores pueden almacenarse en variables, transmitirse como parámetros o devolverse como resultados.

En Lua, hay 8 los tipos de datos básicos son: nil, booleano, número, cadena, datos de usuario, función, hilo y tabla.

tipo de datosdescripción
nilEste es el más simple, solo el valor nil pertenece a esta categoría, que representa un valor no válido (equivalente a falso en expresiones condicionales).
booleancontiene dos valores: falso y verdadero.
numberrepresenta un número de punto flotante de precisión doble
stringla cadena se representa con un par de comillas dobles o comillas simples
funciónfunción escrita en C o Lua
datos de usuariorepresenta una estructura de datos C almacenada en una variable
hilorepresenta una línea de ejecución independiente, utilizada para ejecutar programas cooperativos
tablaEn Lua, la tabla (table) es realmente una "matriz asociativa" (associative arrays), la índice de la matriz puede ser un número, una cadena o un tipo de tabla. En Lua, la creación de una tabla se realiza mediante una "expresión de construcción", la expresión de construcción más simple es {}, que se utiliza para crear una tabla vacía.

Podemos usar la función type para probar el tipo de una variable o valor dado:

print(type("Hello world"))      --> cadena
print(type(10.4*3))             --> número
print(type(print))              --> función
print(type(type))               --> función
print(type(true))               --> booleano
print(type(nil))                --> nil
print(type(type(X)))            --> cadena

nil (vacío)

El tipo nil representa una especie de valor sin valor válido, que tiene solo un valor -- nil, por ejemplo, al imprimir una variable sin asignar, se devuelve un valor nil:

> print(type(a))
nil
>

Para las variables globales y las tablas, nil también tiene un efecto de "eliminar", asignar un valor nil a una variable global o a una variable en la tabla de la tabla es equivalente a eliminarlas, ejecutar el siguiente código para ver:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) hacer
    print(k .. " - " .. v)
end
 
tab1.key1 = nil
for k, v in pairs(tab1) hacer
    print(k .. " - " .. v)
end

cuando se compara con nil, debe agregarse comillas dobles ":

> type(X)
nil
> type(X)==nil
falso
> type(X)=='nil'
verdadero
>

el resultado de type(X)==nil es falso la razón es que type(X) es esencialmente una cadena de "nil", que es un tipo de cadena:

type(type(X))==cadena

boolean (booleano)

El tipo booleano tiene dos valores posibles: true (verdadero) y false (falso), Lua considera false a false y nil, y true a todo lo demás, incluso al número 0:

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("Al menos uno es true")
else
    print("false y nil son 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 siguiente código es:

$ lua test.lua 
boolean
boolean
nil
false y nil son false
El número 0 es true

number (número)

Lua tiene solo un tipo de número por defecto -- double (double precisión) tipo (el tipo por defecto se puede modificar en luaconf.h), las siguientes formas se consideran como tipo number:

print(type(2))
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 siguiente código es:

number
number
number
number
number
number

string (cadena)

Las cadenas se representan con un par de comillas dobles o simples.

string1 = "this is string1"
string2 = 'this is string2'

También se puede usar 2 se utilizan dos corchetes cuadrados "[[]]" para representar "un bloque" de cadena.

Ejemplo en línea

html = [[
<html>
<head></head>
<body>
    <a href="http://es.oldtoolbag.com/">Tutoriales básicos</a>
</body>
</html>
]]
print(html)
El resultado de ejecutar el siguiente código es:
<html>
<head></head>
<body>
    <a href="http://es.oldtoolbag.com/">Tutoriales básicos</a>
</body>
</html>

Cuando Lua realiza una operación aritmética en una cadena de números, intenta convertir esa cadena de números en un número:

> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: intento de realizar una operación aritmética en un valor de cadena
stack traceback:
        stdin:1: en main chunk
        [C]: en?
>

El código anterior contiene "error" + 1El ejecutar produjo un error, la concatenación de cadenas utiliza .., por ejemplo:

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>

Usar # para calcular la longitud de una cadena de texto, colóquelo antes de la cadena de texto, como en el siguiente ejemplo:

> len = "es.oldtoolbag.com"
> print(#len)
14
> print(#"es.oldtoolbag.com)
14
>

tabla (table)

En Lua, la creación de una tabla se realiza a través de una "expresión de construcción", la expresión de construcción más simple es {} para crear una tabla vacía. También se puede agregar algunos datos a la tabla y inicializarla directamente:

-- Crear una tabla vacía
local tbl1 = {}
 
-- inicialización directa de tabla
local tbl2 = {"apple", "pear", "orange", "grape"}

En Lua, una tabla (table) es realmente una "tabla asociativa" (associative arrays), y los índices de los arrays pueden ser números o cadenas de texto.

-- archivo de script table_test.lua
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 la ejecución del script es:

$ lua table_test.lua 
key : value
10 : 33

Diferente de otros lenguajes de programación que utilizan 0 como índice inicial de un array, en Lua, el índice inicial por defecto de una tabla generalmente es 1 comienzo.

-- table_test2.lua archivo de script
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

El resultado de la ejecución del script es:

$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

La tabla no tiene un tamaño fijo, su longitud aumenta automáticamente cuando se agrega nuevos datos, y todas las tablas sin inicializar son nil.

-- table_test3.lua archivo de script
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

El resultado de la ejecución del script es:

$ lua table_test3.lua 
val
nil

function(función)

En Lua,la función se considera como "primer tipo de valor (First-Class Value",la función puede existir en una variable:

-- function_test.lua archivo de script
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 la ejecución del script es:

$ lua function_test.lua 
120
120

Las funciones pueden pasarse como funciones anónimas (funciones anónimas) a través de parámetros:

-- function_test2.lua archivo de script
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 la ejecución del script es:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread (hilo)

En Lua, la principal línea de trabajo es la coroutine. Es casi lo mismo que un hilo (thread), tiene su propia pila, variables locales e índice de instrucciones, y puede compartir variables globales y la mayoría de las otras cosas con otras coroutines.

La diferencia entre hilo y coroutine: los hilos pueden ejecutarse simultáneamente, mientras que las coroutines solo pueden ejecutarse una a la vez, y las coroutines en estado de ejecución solo se detienen cuando se suspenden (suspend).

userdata (tipo personalizado)

userdata es un tipo de datos personalizado del usuario, utilizado para representar un tipo de datos proporcionado por la aplicación o C/C++ Biblioteca de lenguaje que crea tipos, que puede almacenar cualquier C/C++ de cualquier tipo de datos (generalmente struct y puntero) almacenados en variables de Lua al llamarlos.