Bienvenidos sean a este post, hoy veremos dos formas de trabajar muy habituales en este y otros lenguajes como son las variables locales, antes vimos los globales, y los bloques de instrucciones, en el caso de las variables locales tienen como caracteristica un area limitada de trabajo ocasionando que no esten en todo el programa, a diferencia de las globales, y su forma de iniciar es distinta de las variables globales ya que estas se crean por medio de la palabra clave local, veamos un ejemplo:

Anuncios
j = 10		--> Esta es una variable global
local i = 1	--> Esta es una variable local

Los bloques de instrucciones son en general el cuerpo donde declaramos instrucciones para una estructura de datos, el cuerpo de una funcion, o un chunk, veamos el siguiente codigo de ejemplo:

local.lua

x = 10
local i = 1

while i<=x do
        local x = i*2
        print("El valor de X: " .. x)
        i = i + 1
end

if i > 20 then
        local x
        x = 20
        print("El valor de x local " .. x + 2)
else
        print("El valor de x global " .. x)
end

print("El valor de x global " .. x)

Este codigo les recomiendo usarlo a traves de un archivo porque si lo usan en modo interactivo deberan hacer unas pequeñas modificaciones, hablaremos luego de esto, en este caso tendremos una variable global (x), una variable local (i), luego tendremos un bucle while donde chequeara si i es menor o igual que x (el global) si es verdad hara el ciclo, en el bloque del bucle crearemos una variable local llamada x donde tomaremos el valor de i y lo multiplicaremos por 2, luego lo mostraremos en pantalla, nuestro ultimo paso sera incrementar a la variable i, despues usaremos un condicional para chequear si i es menor a 20, dentro del bloque del condicional crearemos un variable local llamada x donde luego le estableceremos el valor de 20 para mostrar el valor de este x mas 2, en caso contrario de no cumplirse la condicion mostramos el valor de x pero en este caso es el global, por ultimo mostraremos el valor de x pero en este caso sera el valor global, ejecutemos el programa y veamos la salida:

Anuncios
tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3 local.lua
El valor de X: 2
El valor de X: 4
El valor de X: 6
El valor de X: 8
El valor de X: 10
El valor de X: 12
El valor de X: 14
El valor de X: 16
El valor de X: 18
El valor de X: 20
El valor de x global 10
El valor de x global 10
tinchicus@dbn001dsk:~/lenguaje/lua$

En este caso tenemos todos los valores de la x local dentro del primer while, luego como nosotros chequeamos si i es mayor a 20 pero recuerden que es local del bucle anterior por lo tanto para este condicional no existe por lo que directamente nos devuelve al x global y lo mismo ocurre con el caso siguiente dado que las x locales no tienen ingerencia fuera de su bloque.

Para poder trabajar con el ejemplo anterior en modo interactivo deberiamos hacer una modificacion como quitar la palabra local a la variable i porque esto hace que el interprete lo tome como un chunk y en el siguiente bloque nos devolvera un error dado que i tendra un valor nil y estara fuera de su rango, o la otra forma de solucionarlo es por medio de encerrar en un bloque do-end porque de esta forma todo lo que este dentro de este bloque no se ejecutara y hara que solo despues del end Lua lo interprete como un chunk, evitando que Lua ejecute linea por linea, veamos el caso:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> do
>> x = 10
>> local i = 1
>> while i <= x do
>> local x = i * 2
>> print(x)
>> i = i + 1
>> end
>> if i > 20 then
>> local x
>> x = 20
>> print(x)
>> else
>> print(x)
>> end
>> print(x)
>> end
2
4
6
8
10
12
14
16
18
20
10
10
>

Una buena practica en programacion es siempre recomendable usar variables locales, siempre que se pueda, porque nos evita tener un exceso de variables globales de uso innecesario, recuerden que usa memoria, otra caracteristica es que la variable local es mas rapida que la global, y como dijimos antes las variables locales tienen un rango determinado y una vez alcanzado estas desaparecen y liberan memoria, Lua maneja las declaraciones de variables locales como declaraciones generales, es decir donde puedas escribir una declaracion local podras escribir una declaracion general, como vimos antes el rango de la declaracion estara establecido entre el comienzo de la declaracion del bloque (if, while, do, etc) y hasta el final del mismo con la palabra end.

En todos los casos tienen la misma forma de inicializarse dentro del bloque, siempre tendremos un valor inicial de asignacion, lo cual trabaja de la misma forma que vimos hasta ahora sino se inicia automaticamente tendra un valor nil, se puede crear y luego iniciar, y toda variable extra que creemos dentro del bloque siempre tendra valor nil automaticamente, veamos el siguiente ejemplo:

Anuncios

local2.lua

local a, b = 1, 10
if a < b then
        print(a)
        local a
        print(a)
end
print(a, b)

En este caso primero crearemos dos locales variables llamadas a y b donde le asignaremos los valores 1 y 10 respectivamente, despues tendremos un condicional donde chequearemos que a sea menor que b para imprimir el valor de a, luego crearemos una variable local llamada a, la cual adopta el valor nil implicitamente, y volvemos a mostrar el valor de a, por ultimo fuera del condicional mostramos los valores de a y b, probemos el programa y veamos su salida:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3 local2.lua
1
nil
1       10
tinchicus@dbn001dsk:~/lenguaje/lua$

Vean como el primer valor de a corresponde al valor por fuera del condicional, el segundo como lo creamos local del bloque del condicional y sin valor nos devuelve un nil pero cuando volvemos a pedir el valor de a por fuera del condicional vemos que a sigue con el valor inicial, el motivo por el que la variable a no fue afectada porque la segunda variable a que creamos “murio” cuando salimos del bloque del condicional y la otra en realidad nunca fue afectada, para esto se usa las variables locales, otra aplicacion muy habitual de las variables locales es:

local foo = foo

Este ejemplo que vemos arriba es la creacion de una variable local foo la cual es inicializada por el valor variable global foo, esto es especialmente util para dos cosas: la primera nos ayuda a mantener el valor intacto de la variable global foo pese a que luego pueda ser modificada por otra funcion y la segunda nos mejora la velocidad de acceso al valor de la misma, en la mayoria de los lenguajes las declaraciones de las variables suele hacerse en el comienzo de un bloque, procedimiento o funcion, y por esto muchos piensan que es una mala practica declarar las mismas en el medio del bloque, por lo contrario en Lua se recomienda declarar una variable solo cuando sea necesario, declararla sin ningun valor inicial y cuando llegue el momento asignarle alguno, y por ultimo la reduccion del rango de las mismas permite una mejor lectura del codigo.

Anuncios

En resumen, hoy hemos visto que son las variables locales, cual es su uso, su rango de uso, como usarlas en codigo, y como usarlas en modo interactivo, tambien hemos hablado sobre bloques, como nos ayudan a la hora de utilizar varias instrucciones, algunos ejemplos de como se aplica, y como nos ayudan con las variables locales en modo interactivo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00