Variables, valores y tipos
Lua es un lenguaje tipado dinámicamente. Para los que saben javascript, esto es sencillo de entender. ¿Qué significa que un lenguaje es tipado dinámicamente? Es muy sencillo. En lenguajes como Java, cuando se declara una variable hay que declarar su tipo, int, float, String o lo que sea, y esa variable sólo podrá almacenar valores del tipo declarado (o bien de una clase derivada).
En lenguajes tipados dinámicamente, como Lua, una variable puede contener un valor de cualquier tipo, o dicho más exactamente, puede apuntar a valores de cualquier tipo. Además, es posible que una variable que apunte a un valor de un tipo, más tarde apunte a un valor de otro tipo.
Por ejemplo:
contador = 14
Estamos declarando una variable que se llama contador y que apunta a un valor de tipo numérico que vale 14. Se observa que no hemos declarado ningún tipo para la variable.
Más adelante podríamos hacer:
contador = "43"
Ahora, la misma variable contador apunta a otro valor, esta vez de tipo string.
Tipos de datos en Lua:
- nil - indica que la variable no ha sido inicializada (también se puede asignar nil a una variable explícitamente).
- boolean - puede ser true o false.
- number - cualquier número, entero o real. Lua utiliza punto flotante de doble precisión para todos los números.
- string - cadena de caracteres.
- function - un bloque de código que se puede invocar.
- table - es el tipo más complejo que tiene Lua. Más adelante veremos espcíficamente las tablas.
Una variable se puede declarar en cualquier lugar simplemente asignándole un valor:
contador = 14
Cuando se declara una variable de esta forma, tiene un ámbito global y existirá durante toda la ejecución del programa. Podremos acceder a esta variable desde cualquier punto del programa. Si queremos que el recolector de basura elimine la memoria ocupada por la variable, tenemos que asignarle nil:
contador = nil
Se dice que el ámbito o scope de esta variable es global. Pero también existe un ámbito de bloque, por ejemplo dentro de una función:
function calculate()
local total = 7
end
Al poner local, la variable total tiene ámbito de bloque: sólo existe dentro de la función, y desaparecerá cuando retorne la función. El recolector de basura eliminará la memoria ocupada por la variable cuando retorne la función (incluso aunque no le asignemos nil).
Se recomienda siempre utilizar local para las variables, excepto cuando deseemos que una variable tenga ámbito global. Cuando dentro del programa se utiliza una variable (sin usar local), Lua busca en el ámbito local para ver si existe, si no existe, busca en el bloque superior y así sucesivamente hasta llegar al ámbito global. Si no existiera, la variable se crea. El rendimiento será muy superior si declaramos todas las variables local, para evitar la cadena de búsquedas de Lua. Además, todos sabemos que las variables globales no son buenas, porque es muy fácil cometer un error y sobreescribirlas en algún lugar del programa sin darnos cuenta.
También hay que tener en cuenta que cuando declaramos una variable local en un bloque, esta variable se utiliza en el bloque aunque exista otra con el mismo nombre en un bloque externo o bien en el ámbito global. Por ejemplo:
contador = 3
function incrementar()
local contador = contador + 1
end
-- aquí el valor de contador es 3
Hay una forma de acceder directamente a una variable global, aunque tengamos variables locales con el mismo nombre y además, evitando la cadena de búsqueda de Lua:
contador = 3
function incrementar()
local contador = contador + 1
_G.contador = _G.contador + 1
end
-- aquí el valor de contador es 4
Lua almacena todas las variables globales en una tabla llamada _G, por tanto podemos acceder a cualquier variable global a través de esta table.
Las variables locales de bloque no sólo se pueden utilizar dentro de una función, también se pueden utilizar en otros bloques como if o bucles.
En Lua se pueden realizar asignaciones múltiples:
local x, y = 3, 4
Esto permite realizar hacer un swap de dos variables de una forma muy sencilla:
x, y = y, x
Expresiones y operadores
Los operadores y expresiones en Lua son muy similares a los de otros lenguajes de programación.
Operadores matemáticos:
- + suma
- - resta o negativo
- * multiplicación
- / división
- % módulo
- ^ exponenciación
Operadores de comparación (retornan true o false):
- == igualdad (si los tipos no son iguales, retorna false)
- ~= desigualdad
- < menor que
- > mayor que
- <= menor o igual que
- >= mayor o igual que
Operadores lógicos:
- and
- or
- not
Los operadores lógicos consideran que false y nil son false, y todos los demás valores son true.
Los operadores and y or hacen una evaluación con corto-circuito, es decir, si el primer valor de un and es false, no evalúa el segundo, y si el primer valor de un or es true, no evalúa el segundo.
Operador de concatenación:
- .. concatenación de strings y números
Operador longitud:
- # longitud de un array (veremos este operador cuando estudiemos las tablas, porque un array es una tabla en Lua)
No hay comentarios:
Publicar un comentario