Bienvenidos sean a este post, en el post anterior dijimos que for tiene dos formas de trabajar y en ese post hablamos sobre el for pero numerico y hoy hablaremos sobre la otra forma de for llamada for generico, este trabaja por medio de una funcion iterator, su sintaxis es la siguiente:

Anuncios
for i,v in ipairs(nombreTabla) do print(v) end
-- Este bucle nos devuelve todos los valores de la tabla

for k in pairs(nombreTabla) do print(k) end
-- Este bucle nos devuelve todas las claves de la tabla

Este tipo de bucle nos provee dos iterator, uno es ipairs y otro es pairs, con el primer iterator podremos obtener los valores contenidos en la tabla, en el segundo iterator nos servira para obtener todos los datos de la tabla, si bien estos casos son simples y los mas utilizados para esta funcion, esta tambien posee otros iterators mas, como por ejemplo las lineas de un archivo (io.line), las palabras de una cadena (string.gmatch), y muchas mas.

Este for comparte algunas caracteristicas con respecto al for numerico, una de ellas son que las variables del bucle son locales de la misma, y no deberia ser usadas para asignarse valores, pasemos a ver el siguiente ejemplo para entenderlo mejor:

for02.lua

dias = {"Domingo","Lunes","Martes","Miercoles","Jueves",
                "Viernes","Sabado"}
revDias = {}
for i,v in ipairs(dias) do
        revDias[v]=i
end
for i=1,#dias do
        local x = dias[i]
        print(x, revDias[x])
end
Anuncios

En este ejemplo tendremos una tabla llamada dias con todos los nombres de la semana, como sabemos al no asignar ninguna clave cada elemento obtendra una posicion automatica comenzando desde 1, en este caso nosotros queremos hacer otra tabla pero en reversa es decir que el indicador de posicion sea el nombre del dia y el valor de la posicion es decir hacer un reverso de la tabla dias, esto lo podriamos hacer manualmente pero en este caso lo haremos con el resto del programa. Nuestro siguiente paso es crear una tabla vacia llamada revDias, despues usaremos un bucle for donde el primer dato corresponde al indice o posicion, y la segunda variable es la encargada de contener el valor de dicha posicion, despues le diremos cual iterator usar (para nuestro ejemplo es ipairs) donde le indicaremos la tabla a usar, dias, en el bloque diremos que a revDias le pondremos en la posicion el valor almacenado en v y en donde va el valor le pondremos el valor contenido en i, una vez terminado pasaremos al siguiente bucle for del tipo numerico pero con la particularidad que usaremos a la variable i que comience con 1 y el limite estara determinado con el operador de tamaño (#) relacionado a la tabla dias, en el bloque usara una variable local llamada x donde le asignaremos el valor de la tabla dias informado por i, luego mostraremos en pantalla el valor almacenado en x y su valor contenido en revDias, si probamos el programa veremos la siguiente salida:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3 for02.lua
Domingo 1
Lunes   2
Martes  3
Miercoles       4
Jueves  5
Viernes 6
Sabado  7
tinchicus@dbn001dsk:~/lenguaje/lua$

Como pueden ver se genero perfectamente la tabla con el nombre de los dias, la tabla con los dias en reverso (revDias), y al verlos tenemos perfectamente el nombre relacionado con la posicion.

Anuncios

En resumen, hoy hemos visto los for genericos, como son, para que se usan, su sintaxis, hemos hablado de algunos iterators, pusimos en practica un ejemplo, 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