1 00:00:00,440 --> 00:00:04,440 En esta sesión, hablaremos sobre iteradores y colecciones. 2 00:00:04,600 --> 00:00:09,000 Veremos como recorrer fácilmente las colecciones Gracias a los iteradores en Pharo. 3 00:00:09,160 --> 00:00:13,000 Entenderá El poder de los iteradores en Pharo. 4 00:00:13,160 --> 00:00:17,640 Revisaré los iteradores principales que puede utilizar. 5 00:00:17,800 --> 00:00:19,360 Un primer ejemplo 6 00:00:19,520 --> 00:00:22,680 este es el código que debería escribir en Java 7 00:00:23,880 --> 00:00:25,320 para recorrer una colección 8 00:00:25,480 --> 00:00:28,160 Exploraré las personas de la colección. 9 00:00:28,320 --> 00:00:31,920 Para extraer la lista de personas (objecto Persona). 10 00:00:32,480 --> 00:00:35,240 En Pharo, escribiría este código. 11 00:00:35,400 --> 00:00:39,880 Usaría el iterador collect: Hablaremos de el más tarde. 12 00:00:40,040 --> 00:00:43,360 Recoge todos los nombres de personas. 13 00:00:43,520 --> 00:00:47,920 Por cierto, en Java 8, la última versión de Java 14 00:00:48,080 --> 00:00:51,120 Han presentado los bloques, 15 00:00:51,280 --> 00:00:53,640 el equivalente de cierres léxicos. 16 00:00:53,800 --> 00:00:57,000 Como resultado, la sintaxis se acerca a Pharo. 17 00:00:57,160 --> 00:01:00,200 Pero en Pharo, lo hemos tenido desde el comienzo. 18 00:01:00,360 --> 00:01:02,440 Está en el corazón del idioma. 19 00:01:02,600 --> 00:01:07,320 Da gran poder de expresión. a un programador 20 00:01:08,200 --> 00:01:11,320 Hay muchos iteradores. 21 00:01:11,480 --> 00:01:16,400 Primero, hay "collect:" ¿cual es el uso de "collect:" cuando se envía a una colección? 22 00:01:16,560 --> 00:01:20,240 Esta es una colección de números positivos y negativos. 23 00:01:20,400 --> 00:01:23,200 Envío el mensaje "collect:", y paso un bloque 24 00:01:23,360 --> 00:01:25,560 Cada vez que navega por la colección, 25 00:01:25,720 --> 00:01:30,160 el parámetro del bloque será a su vez: 2, -3, 4, etc. 26 00:01:30,320 --> 00:01:33,760 Luego envía el mensaje abs, para absoluto 27 00:01:33,920 --> 00:01:36,840 Significa que quieres el valor absoluto de este numero 28 00:01:37,000 --> 00:01:40,720 Una vez que haya aplicado el bloque a cada elemento de la colección, 29 00:01:40,880 --> 00:01:43,360 agrega los resultados en una nueva colección. 30 00:01:43,520 --> 00:01:46,520 El resultado devuelto por collect Es una nueva colección. 31 00:01:46,680 --> 00:01:50,160 El bloque se ha aplicado a cada elemento de la colección: 32 00:01:50,320 --> 00:01:53,800 el valor absoluto de 2, el valor absoluto de -3, que es 3, 33 00:01:53,960 --> 00:01:58,480 el valor absoluto de 4, 4, el valor absoluto de -35, 35. 34 00:01:58,640 --> 00:02:00,320 y el valor absoluto de 4, 4. 35 00:02:01,080 --> 00:02:04,200 Lo interesante que debe recordar 36 00:02:04,360 --> 00:02:06,760 es que debe pensar en el objeto. 37 00:02:06,920 --> 00:02:09,720 Pedimos a la colección hacer algo por nosotros 38 00:02:09,880 --> 00:02:14,440 La colección navega por sus propios elementos por sí misma. 39 00:02:14,600 --> 00:02:17,240 Proporcionamos el procesamiento de cada elemento 40 00:02:17,400 --> 00:02:20,400 Ahí es donde está el secreto de los iteradores. 41 00:02:21,040 --> 00:02:23,280 Este es otro ejemplo de "collect:" 42 00:02:23,440 --> 00:02:27,000 Esta es una colección a la que envío el mensaje "collect:" 43 00:02:27,160 --> 00:02:31,000 En el bloque, preguntaré cada vez 44 00:02:31,760 --> 00:02:34,200 si el elemento es inpar. 45 00:02:34,360 --> 00:02:37,160 Voy a agregar todos los resultados 46 00:02:37,320 --> 00:02:40,080 false, true, false, true. 47 00:02:43,720 --> 00:02:47,480 Por supuesto, puede escribir 48 00:02:47,640 --> 00:02:50,400 lo que normalmente escribiría en otros idiomas 49 00:02:50,560 --> 00:02:52,680 sin bloques e iteradores. 50 00:02:52,840 --> 00:02:55,160 Podría escribir: tomo la colección, 51 00:02:55,760 --> 00:02:58,680 construyo una colección de resultados. 52 00:02:59,320 --> 00:03:03,560 Recorro desde uno al tamaño de la colección. 53 00:03:03,720 --> 00:03:04,960 Usaré do 54 00:03:05,120 --> 00:03:08,920 Recorro la colección y cada vez lo agrego a la colección de resultados. 55 00:03:09,080 --> 00:03:12,400 Puedes escribir todo esto. Es exactamente lo mismo. 56 00:03:12,560 --> 00:03:15,440 Tu decides. ¿Quieres escribir algo simple? 57 00:03:15,600 --> 00:03:19,000 o algo complicado? Esa es la pregunta. 58 00:03:19,160 --> 00:03:22,000 Prefiero la primera solución. 59 00:03:24,200 --> 00:03:27,120 En la jerarquía de las colecciones Pharo, 60 00:03:28,320 --> 00:03:32,000 hay algo crucial: todas las colecciones son polimórficas 61 00:03:32,160 --> 00:03:35,080 y heredan de la clase Collection. Entonces tienes una API común. 62 00:03:35,240 --> 00:03:39,720 La ventaja es que los iteradores también funcionaran 63 00:03:39,880 --> 00:03:42,840 con la mayoría de colecciones. 64 00:03:44,480 --> 00:03:48,080 Realmente se trata de pensar en un objeto: 65 00:03:48,240 --> 00:03:51,280 le pide a la colección Iterar sobre sus elementos para nosotros. 66 00:03:51,440 --> 00:03:54,800 No sabemos si estamos usando un diccionario. 67 00:03:54,960 --> 00:03:58,880 No queremos saber sobre la lógica interna de claves, valores, etc. 68 00:03:59,400 --> 00:04:02,320 Entonces le pide a la colección que se recorra 69 00:04:02,480 --> 00:04:04,960 y procese sus elementos. 70 00:04:06,640 --> 00:04:11,320 Se pueden usar muchos iteradores para hacer esto. Ya vimos "do:" y "collect:" 71 00:04:11,480 --> 00:04:14,280 Hay mas: "select:", "reject:", "detect:", etc. 72 00:04:14,440 --> 00:04:17,840 Estudiaremos algunos de estos Más adelante en este curso. 73 00:04:19,320 --> 00:04:22,760 "do:" es el iterador más simple. 74 00:04:22,920 --> 00:04:26,960 Navega por todos los elementos de la colección, lo muestro en el Transcript. 75 00:04:27,120 --> 00:04:30,560 Ya lo vimos muchas veces. 76 00:04:30,720 --> 00:04:33,320 Este es un nuevo iterador, "select:". 77 00:04:33,480 --> 00:04:36,560 Quiero obtener todos los elementos de la colección 78 00:04:36,720 --> 00:04:38,360 que coinciden con un criterio. 79 00:04:38,520 --> 00:04:41,960 Quiero todos los elementos inpares de la colección 80 00:04:42,120 --> 00:04:45,040 Envío "select:" a la colección. 81 00:04:45,200 --> 00:04:46,440 Paso un bloque 82 00:04:46,600 --> 00:04:49,560 Siempre que el valor del bloque sea true, 83 00:04:49,720 --> 00:04:53,080 el elemento involucrado se agrega a la colección de resultados. 84 00:04:55,040 --> 00:04:58,080 Es exactamente lo mismo que "select: #odd" 85 00:04:58,240 --> 00:05:01,120 Cuando tengo un bloque aquí 86 00:05:01,280 --> 00:05:05,400 o lo que equivale mensaje unario de envío al elemento de la colección, 87 00:05:05,560 --> 00:05:06,920 el parámetro del bloque, 88 00:05:07,080 --> 00:05:10,760 Puedo mostrar el nombre del mensaje para ser enviado como un símbolo. 89 00:05:10,920 --> 00:05:12,480 Es incluso más corto. 90 00:05:12,640 --> 00:05:16,000 Solo funciona con mensajes unarios. 91 00:05:17,920 --> 00:05:20,880 Puede usar otros tipos de iteradores. como "reject:" 92 00:05:21,040 --> 00:05:24,160 Quiero deshacerme de los elementos inpares. de la colección 93 00:05:24,320 --> 00:05:27,520 En los resultados, Solo tendré elementos inpares. 94 00:05:28,520 --> 00:05:30,160 O quiero usar "detect:" 95 00:05:30,320 --> 00:05:34,000 Quiero detectar el primer elemento que coincide con un criterio 96 00:05:34,160 --> 00:05:37,000 el valor del bloque debe ser true. 97 00:05:37,160 --> 00:05:40,920 Quiero el primer elemento inpar de la colección 98 00:05:42,320 --> 00:05:46,880 A veces, quieres detectar el primero elemento que coincide con un criterio 99 00:05:47,040 --> 00:05:50,120 Si no hay ninguno, desea un valor predeterminado: 100 00:05:50,280 --> 00:05:52,440 "detect: ifNone:" 101 00:05:52,600 --> 00:05:57,360 Si no hay coincidencia, devolverá el valor de este bloque, 102 00:05:57,520 --> 00:05:59,640 que es 0 103 00:05:59,800 --> 00:06:04,800 Hay otros iteradores que facilitan la vida al programador. 104 00:06:04,960 --> 00:06:06,800 Por ejemplo, "anySatisfy:" 105 00:06:06,960 --> 00:06:10,600 comprueba si un objeto cumple un criterio 106 00:06:10,760 --> 00:06:13,320 Puede comprobar si todos los objetos cumple con el criterio 107 00:06:13,480 --> 00:06:17,320 Puede navegar por la colección al revés, desde el final. 108 00:06:17,480 --> 00:06:22,360 Puede navegar por la colección utilizando un indice o explorar sus elementos por pares. 109 00:06:22,520 --> 00:06:26,480 Puede navegar por todas las permutaciones circulares, etc. 110 00:06:26,640 --> 00:06:28,960 Hay muchos iteradores. 111 00:06:29,120 --> 00:06:31,480 También puede crear otras nuevas. 112 00:06:31,640 --> 00:06:35,320 Quiere explorar una colección (1 2 3) 113 00:06:35,480 --> 00:06:38,440 con otra colección (10 20 30). 114 00:06:38,600 --> 00:06:42,600 En el bloque, "do:", tengo ":x" y ":y" que son dos parámetros. 115 00:06:42,760 --> 00:06:46,840 ":x" es un elemento de la primera colección 116 00:06:47,000 --> 00:06:48,920 ":y", de la segunda 117 00:06:49,080 --> 00:06:51,080 al multiplicar estos elementos 118 00:06:51,240 --> 00:06:53,720 Los resultados son 10, 40 y 90. 119 00:06:54,840 --> 00:06:59,440 Por supuesto, con este iterador, las dos colecciones deben ser de igual longitud. 120 00:07:01,360 --> 00:07:04,720 Hay otras formas 121 00:07:04,880 --> 00:07:08,120 aquí utilizo "do: separatedBy:" 122 00:07:08,280 --> 00:07:11,280 Tengo una colección Examino cada elemento. 123 00:07:11,440 --> 00:07:14,040 Cada vez que se navega un elemento, 124 00:07:14,200 --> 00:07:17,680 Doy valor a un bloque que coincide con una coma. 125 00:07:17,840 --> 00:07:20,480 Entonces puedo navegar a, 126 00:07:20,640 --> 00:07:23,320 mostrar una coma, luego b, una coma, luego c. 127 00:07:23,480 --> 00:07:26,400 Entre cada elemento, Realizo una acción. 128 00:07:28,880 --> 00:07:31,640 Este es el iterador "groupedBy:" 129 00:07:31,800 --> 00:07:36,040 Puedo usarlo para agrupar los elementos de una colección 130 00:07:36,200 --> 00:07:37,720 en función de un criterio. 131 00:07:37,880 --> 00:07:42,040 Envié este mensaje a la colección 1 2 3 4 5 6 7. 132 00:07:42,200 --> 00:07:45,480 Como resultado, obtengo un diccionario: 133 00:07:47,000 --> 00:07:50,440 todos los elementos que devolvieron false a este criterio, 134 00:07:50,600 --> 00:07:52,800 que fue #even, los elementos pares. 135 00:07:52,960 --> 00:07:56,000 Como puede ver, Tengo todos los elementos inpares. 136 00:07:56,160 --> 00:07:59,520 Todos los elementos pares devueltos son true. 137 00:08:02,280 --> 00:08:04,520 A menudo es el caso, cuando computa, 138 00:08:04,680 --> 00:08:07,720 que tiende a anidar colecciones en colecciones 139 00:08:07,880 --> 00:08:11,440 Termina con grandes niveles de anidación. 140 00:08:11,600 --> 00:08:14,480 Este es un ejemplo creado a mano. 141 00:08:14,640 --> 00:08:17,560 Estas son colecciones anidadadas en colecciones. 142 00:08:17,720 --> 00:08:22,200 Nos gustaría aplanar la colección para igualarlo todo. 143 00:08:22,880 --> 00:08:26,960 En Pharo, hay una manera fácil 144 00:08:27,120 --> 00:08:29,120 el iterador "flatCollect:" 145 00:08:29,280 --> 00:08:33,520 Examino los elementos y creo una nueva colección donde todo es plano. 146 00:08:35,240 --> 00:08:38,280 Entrega la colección 1 2 3 4 5 6. 147 00:08:38,440 --> 00:08:40,600 Los niveles de anidamiento han desaparecido. 148 00:08:44,040 --> 00:08:48,520 No tengo la intención de presentarle cada iterador de Pharo. 149 00:08:48,680 --> 00:08:52,480 Sería largo y desagradable. Solo quiero mostrar que hay muchos. 150 00:08:52,640 --> 00:08:54,280 Puede definir su propio. 151 00:08:54,440 --> 00:08:57,760 Al leer los métodos en la clase Collection 152 00:08:57,920 --> 00:08:59,560 averigua sobre ellos. 153 00:08:59,720 --> 00:09:02,960 Por ejemplo, empiece por los iteradores que ya conoce. 154 00:09:03,120 --> 00:09:05,840 Puedo preguntarme cómo se implementa "do:" 155 00:09:06,000 --> 00:09:08,600 Lo busco en la jerarquía de colecciones. 156 00:09:08,760 --> 00:09:13,760 Me doy cuenta de que está implementado como SequenceableCollection. 157 00:09:13,920 --> 00:09:16,680 El método "do:" selecciona aBlock como su parámetro. 158 00:09:16,840 --> 00:09:19,400 Esta es la implementación de la colección. 159 00:09:19,560 --> 00:09:23,320 1 to: self size do: [i:|aBlock value: (self at: i)]. 160 00:09:23,480 --> 00:09:26,600 Evalúo el bloqueo utilizado como parámetro 161 00:09:26,760 --> 00:09:29,840 pasándole el elemento en el indice i. 162 00:09:30,000 --> 00:09:31,160 Es muy fácil. 163 00:09:31,960 --> 00:09:37,280 En Pharo, los iteradores son muy poderosos, como acabamos de ver 164 00:09:37,440 --> 00:09:41,880 Cada colección apoya los iteradores polimórficamente. 165 00:09:42,040 --> 00:09:45,200 Los programadores usan iteradores 166 00:09:45,360 --> 00:09:48,240 que se implementan en clases de Collection 167 00:09:49,000 --> 00:09:51,720 de acuerdo con la colección ellos representan. 168 00:09:52,520 --> 00:09:55,200 Puede definir otros nuevos. Es muy interesante. 169 00:09:55,360 --> 00:09:58,840 Puedo definir mis propios iteradores en las clases de Collection 170 00:10:00,480 --> 00:10:04,480 Hay un pequeño matiz quiénes conocen el patrón de diseño del iterador 171 00:10:05,160 --> 00:10:10,480 un desarrollador no puede elegir cuándo pasa al elemento siguiente. 172 00:10:10,640 --> 00:10:14,120 La colección lo decide internamente. 173 00:10:14,280 --> 00:10:17,160 no se envía explícitamente el mensaje next al iterador 174 00:10:17,320 --> 00:10:20,920 Es un matiz para aquellos que conocen el patrón de diseño del iterador. 175 00:10:21,520 --> 00:10:25,720 Los iteradores son muy poderosos. 176 00:10:25,880 --> 00:10:28,960 Son los mejores amigos del programador. 177 00:10:29,120 --> 00:10:31,120 Facilitan la escritura de programas 178 00:10:31,280 --> 00:10:34,280 Puede escribir código breve, simple, y elegante. 179 00:10:34,440 --> 00:10:37,320 Se asegura 180 00:10:37,960 --> 00:10:40,720 la encapsulación de datos en una colección.