Bienvenidos sean a este post, la palabra iteradora es un poco engañosa porque nuestros iteradores no iteratuan sino en realidad lo hace el bucle del for, en realidad los iteradores solo proveen los valores sucesivos para la iteracion, un nombre mas correcto para estas funciones seria generadores pero iteradores es un termino ya establecido en muchos lenguajes como por ejemplo Java, sin embargo tenemos otra forma de construir iteradores que realmente pueden hacer la iteracion, es decir cuando usamos dichos iteradores no usamos un loop sino simplemente llamamos al iterador con un argumento que describe como debe actuar el iterador ante cada iteracion, mas especificamente el iterador recibe un funcion como argumento que se llama dentro del bucle, tomemos como ejemplo nuevamente a palabrasTodas y efectuemos las siguientes modificaciones:

Anuncios
function palabrasTodas(f)
	for linea in io.lines() do
		for palabra in string.gmatch(line, "%w+") do
			f(palabra)
		end
	end
end

Para poder usar este iterador debemos proveer el cuerpo del bucle como una funcion, si queremos que se muestre solo cada palabra usamos a print:

palabrasTodas(print)

Pero a menudo usaremos un funcion anonima en el cuerpo, por ejemplo el siguiente fragmento del codigo cuenta cuantas veces aparece la palabra “hola” en el archivo de entrada:

local contar = 0
palabrasTodas(function (p)
		if p == "hola" then contar = contar + 1 end
	end)
print(contar)
Anuncios

La misma tarea escrita con el iterador anterior no varia mucha:

local contar = 0
for p in palabrasTodas() do
	if p == "hola" then contar = contar + 1 end
end
print(contar)

Estos iteradores fueron populares en las primeras versiones de Lua, cuando no existia la declaracion de for pero como podemos compararlos con los iteradores de estilo generador? Ambos estilos tiene aproximadamente la misma sobrecarga: una llamada de funcion por cada iteracion, por un lado es mas facil escribir el iterador con iteradores verdaderos (a pesar de que podemos recuperar esta facilidad con corutinas) y por otro lado el iterador de estilo generador es mas flexible, primero nos permite dos o mas iteraciones en paralelo (por ejemplo, podemos necesitar una iteracion con dos archivos donde debemos comparar palabra por palabra), y segundo, nos permite el uso de break y return dentro del cuerpo del iterador, con el iterador de verdad el return proviene de la funcion anonima no de la funcion haciendo la iteracion, en general la mayoria utiliza el iterador de tipo generador.

Anuncios

En resumen, hoy hemos visto un iterador de verdad, como es su sintaxis, como se utiliza, como funciona, cuando se usaba y diferencias con el iterador visto hasta ahora, 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