El Por qué y el Cómo de los Iteradores
October 11th, 2006
Este articulo sobre iteradores fue previamente publicado por James Edward Gray II
Un amigo mio me estuvo realizando algunas preguntas en general acerca de iteradores en algunos mails privados que estuvimos intercambiando.
¿Por qué existen los iteradores?
Primero, creemos algunos datos para poder jugar:
Ahora asumamos que queremos imprimir algunos nombres. Podemos usar el iterador each() para eso, sin index:
Eso no es tan diferente a un bucle (loop) pero imaginemos que queremos realizar un find() de algún nombre específico:
Tal vez nos gustaría ver cuales son los apellidos que existen en nuestros registros. Podemos lograrlo al map()ear (otro iterador) los nombres sólo a los apellidos y utilizando un helper simple:
Quizás sólo queremos trabajar con un cinjunto acotado de elementos. Podemos seleccionarlos (select()):
O podemos realizar un sort_by() bajo cierto criterio:
Ahora recordemos, en los lenguajes centrados en el uso de bucles tenemos una estructura de control para estos casos, y suele escribirse de esta forma:
Es necesario especificar todos los detalles cada vez que se desea encontrar un objeto en una lista, o extraer información de la misma. Se recorre el índice, se administra el array/hash/loquesea donde se guardan los datos extraidos y se corta el bucle al finalizar. Nota: En cada uno de los ejemplos de ruby expuestos más arriba hice foco en el objeto individual y en lo que necesitaba hacer con él. Los iteradores están manejando todo el trabajo repetitivo y aburrido por mi, permitiendome concentrame en la tarea principal.
Imagino que un lado malo podría ser que hay aprender cada uno de los nombres de los iteradores, y qué es lo que hacen en vez de un sólo bucle (loop). Ruby trata de disminuir el crecimiento de este pénsamiento al consolidar todos los iteradores en un sólo “mix-in” y usando ese mismo conjunto en los objetos standards, como Array y Hash. Aun mejor, lo único que se debe hacer es definir el método each, realizar un mix-in de Enumerable y obtener así los demás iteradores de manera “gratuita”. Básicamente, sólo los aprendes una vez y los usas en cualquier lugar.
¿Cómo se contruyen los iteradores?
Digamos que queremos construir una lista vinculada (LinkedList) en uby. Algo así:
Contruyamos rápidamente una rutina para poblarla con algunos datos:
Ahora escribamos el iterador each() para esta clase, para permitirle a los usuarios recorrer los valores. usaremos además un límite (limit) opcional también, ya que la lista puede ser muy larga:
Noten como usé el yield para pasarle los valores al bloque de código a medida que accedía a cada uno.
Veamoslo en acción:
Escribamos uno mas, el iterador find() (técnicamente podriamos usar un mix-in para obtenerlo sin necesidad de escribir el código, pero verlo es educativo):
Aca estoy utilizando el yield para saber si el usuario está interesado en este valor. Le paso el valor al bloque de código y espero a que devuelva verdadero o falso.
Podriamos utilizarlo para encontrar cual de los primeros 100 números de la serie fibonacci son dividibles por tres:





Sorry, comments are closed for this article.