1 00:00:00,000 --> 00:00:02,160 En esta sesión, le presentaré los bloques. 2 00:00:02,320 --> 00:00:06,640 Son una especie de métodos anónimos. También se llaman cierres léxicos. 3 00:00:06,800 --> 00:00:08,720 Están en todas partes en Pharo. 4 00:00:08,880 --> 00:00:12,160 Son la base de los ciclos, condicionales, iteradores, 5 00:00:12,320 --> 00:00:14,680 e incluso GUI o lenguajes dedicados. 6 00:00:14,840 --> 00:00:17,120 Están en el corazón del sistema. 7 00:00:17,280 --> 00:00:21,280 Han sido introducidos sólo en la última versión de Java. 8 00:00:23,000 --> 00:00:27,400 Para definir un bloque, use corchetes. 9 00:00:27,560 --> 00:00:28,920 Este es un ejemplo: 10 00:00:29,080 --> 00:00:32,760 [expresiones ...] 11 00:00:34,840 --> 00:00:37,840 Hablaremos sobre la definición de bloques. 12 00:00:38,000 --> 00:00:40,000 Otro ejemplo: 13 00:00:40,160 --> 00:00:42,840 esta expresión, 1/0, 14 00:00:43,000 --> 00:00:46,760 Devuelve un error cuando se ejecuta. 15 00:00:47,760 --> 00:00:50,600 Vamos a encapsularla en un bloque 16 00:00:50,760 --> 00:00:54,920 definiendo un bloque que contiene la expresión 1/0. 17 00:00:55,080 --> 00:01:00,040 Si evalúo la definición de este bloque, no pasa nada; no hay error 18 00:01:00,200 --> 00:01:02,400 Devuelve el bloque 19 00:01:02,560 --> 00:01:06,160 debido a que una definición de bloque no ejecuta su cuerpo. 20 00:01:07,720 --> 00:01:11,480 Puede definir tantos bloques como desée: 21 00:01:11,640 --> 00:01:14,240 las expresiones en su cuerpo están congeladas. 22 00:01:15,240 --> 00:01:18,560 Para evaluar un bloque y las expresiones en su cuerpo, 23 00:01:18,720 --> 00:01:21,760 debe hacerlo explícitamente a través del mensaje value: 24 00:01:21,920 --> 00:01:24,520 Por ejemplo, este es un bloque: [2 + 6] 25 00:01:24,680 --> 00:01:26,640 Le envía el mensaje value: 26 00:01:26,800 --> 00:01:29,760 Las expresiones en el cuerpo son evaluados 27 00:01:29,920 --> 00:01:33,360 Devuelve el resultado, 8. 28 00:01:34,320 --> 00:01:37,760 Sin embargo, si el bloque contiene expresiones erróneas, 29 00:01:37,920 --> 00:01:40,960 se devuelve el error cuando se evalúa el bloque, 30 00:01:41,120 --> 00:01:42,720 como en el ejemplo 2. 31 00:01:42,880 --> 00:01:46,560 [1/0] envío el mensaje value al bloque 32 00:01:46,720 --> 00:01:48,400 Devuelve un error. 33 00:01:49,760 --> 00:01:52,960 Los bloques también pueden tener argumentos. 34 00:01:53,120 --> 00:01:56,240 como en este argumento. Es como los métodos. 35 00:01:56,400 --> 00:02:01,400 Un bloque siempre se abre con [ 36 00:02:01,560 --> 00:02:03,120 y cerrado con ]. 37 00:02:03,280 --> 00:02:08,360 Todos los argumentos tienen por prefijo los dos puntos 38 00:02:08,520 --> 00:02:11,760 Luego hay |, una barra vertical 39 00:02:11,920 --> 00:02:16,240 que separa la declaración de argumentos del cuerpo del bloque, 40 00:02:16,400 --> 00:02:18,200 la expresion que contiene 41 00:02:18,360 --> 00:02:21,560 el argumento en este ejemplo es x. 42 00:02:21,720 --> 00:02:24,360 x + 2 es la única expresión en el bloque 43 00:02:24,520 --> 00:02:27,120 Si envío el mensaje value al bloque, 44 00:02:27,280 --> 00:02:31,040 tiene que usar un mensaje específico, value: con un parámetro. 45 00:02:31,200 --> 00:02:35,600 Al mismo tiempo, pasa value: 5 que reemplaza el argumento x 46 00:02:35,760 --> 00:02:38,560 cuando las expresiones del bloque son evaluados 47 00:02:38,720 --> 00:02:42,880 Si envío el mensaje value: 5 a este bloque, 48 00:02:43,040 --> 00:02:44,400 devuelve 7 49 00:02:44,560 --> 00:02:48,160 ya que el valor de x es 5 cuando se evalúa el bloque. 50 00:02:48,800 --> 00:02:50,680 Esto es como mi ejemplo anterior, 51 00:02:50,840 --> 00:02:55,200 pero con varias expresiones en el bloque 52 00:02:55,360 --> 00:02:58,720 Tengo dos aquí:x + 33 y x + 2. 53 00:02:58,880 --> 00:03:01,400 Cuando envío value: 5 54 00:03:01,560 --> 00:03:04,680 para evaluar las expresiones en el bloque, 55 00:03:04,840 --> 00:03:07,600 la evaluación regresa 56 00:03:07,760 --> 00:03:12,120 solo el valor de la última expresión en el bloque 57 00:03:12,280 --> 00:03:16,200 Solo devuelve el resultado de x + 2, 58 00:03:16,960 --> 00:03:17,960 7. 59 00:03:19,640 --> 00:03:22,480 Los bloques son objetos normales en Pharo. 60 00:03:22,640 --> 00:03:25,120 Pueden ser almacenados en variables temporales. 61 00:03:25,280 --> 00:03:28,160 Se pueden enviar mensajes como los objetos normales 62 00:03:28,320 --> 00:03:31,120 Este es el ejemplo que tengo para usted aquí. 63 00:03:31,280 --> 00:03:35,160 Puede almacenar la definición de este bloque, x + 2, 64 00:03:35,320 --> 00:03:37,080 en una variable llamada add2. 65 00:03:37,240 --> 00:03:40,680 Luego envias mensajes para evaluar el bloque varias veces. 66 00:03:40,840 --> 00:03:43,000 Envío el mensaje value: una vez 67 00:03:43,160 --> 00:03:46,640 diciéndole que se evalúe a sí mismo con value: 5 regresa 7. 68 00:03:46,800 --> 00:03:49,720 Luego el mensaje value: 33. 69 00:03:49,880 --> 00:03:51,920 Regresa 35 70 00:03:52,080 --> 00:03:55,800 También puede definir bloques con varios argumentos 71 00:03:55,960 --> 00:04:00,720 Por ejemplo, x e y. Este bloque tiene dos argumentos. 72 00:04:00,880 --> 00:04:05,160 ¿Pero cómo evaluarías este bloque? 73 00:04:05,320 --> 00:04:09,840 Ya que necesita pasar dos valores para activar su evaluación, 74 00:04:10,000 --> 00:04:13,200 5 y 7 que reemplazan a x e y? 75 00:04:13,840 --> 00:04:19,040 La respuesta es que usa el mensaje value: vale:, 76 00:04:19,760 --> 00:04:22,760 un método del la clase bloque. 77 00:04:22,920 --> 00:04:28,080 5 reemplaza x y 7 reemplaza y. 78 00:04:28,240 --> 00:04:29,880 Regresa 12 79 00:04:32,880 --> 00:04:36,960 Como los métodos, los bloques también puede definir variables temporales. 80 00:04:37,120 --> 00:04:40,680 Este ejemplo es un ejemplo real: 81 00:04:40,840 --> 00:04:43,360 proviene de la colección de clases. 82 00:04:43,520 --> 00:04:47,880 El bloque comienza aquí. Termina ahí 83 00:04:48,880 --> 00:04:52,800 Se necesita un argumento llamado :index. 84 00:04:53,800 --> 00:04:57,520 Se necesita una variable temporal definida aquí entre dos |. 85 00:04:57,680 --> 00:04:58,960 Se llama args. 86 00:04:59,760 --> 00:05:02,200 Esta variable temporal args 87 00:05:02,360 --> 00:05:07,160 existe solo durante la evaluación de las expresiones en el bloque. 88 00:05:09,080 --> 00:05:11,920 Los bloques se definen en los métodos. 89 00:05:12,080 --> 00:05:16,240 En un bloque, también puede usar un retorno. 90 00:05:16,400 --> 00:05:20,600 Esto es un ejemplo de la clase entero. 91 00:05:20,760 --> 00:05:23,280 El método se llama factorial. 92 00:05:24,040 --> 00:05:27,960 Hay varios bloques en el método. 93 00:05:28,120 --> 00:05:31,760 Estos bloques contienen retornos, o ^. 94 00:05:31,920 --> 00:05:35,720 El retorno ayuda para salir del método factorial. 95 00:05:35,880 --> 00:05:39,600 Por ejemplo, si envío el mensaje factorial al entero 0, 96 00:05:39,760 --> 00:05:41,640 Devuelve la respuesta 1. 97 00:05:41,800 --> 00:05:46,880 Obtengo esta respuesta gracias a este ^, el primero en el bloque, 98 00:05:47,040 --> 00:05:49,640 lo que ayuda para salir del método factorial. 99 00:05:49,800 --> 00:05:52,920 Un retorno en un bloque ayuda a salir del método 100 00:05:53,080 --> 00:05:54,960 que define el bloque. 101 00:05:56,680 --> 00:05:59,360 Un pequeño consejo para cuando use bloques: 102 00:05:59,520 --> 00:06:02,400 Los bloques son elementos extremadamente potentes. 103 00:06:02,560 --> 00:06:04,480 Debe usarlos con cuidado. 104 00:06:04,640 --> 00:06:08,440 No vayas más allá de dos o tres argumentos. para un bloque 105 00:06:08,600 --> 00:06:11,320 Si tiene más, se vuelve incomprensible 106 00:06:11,480 --> 00:06:15,280 Es mejor definir una clase con variables y métodos de instancia: 107 00:06:15,440 --> 00:06:17,200 será mucho más legible. 108 00:06:17,960 --> 00:06:22,160 En el curso, estudiamos bloques, su sintaxis, 109 00:06:22,320 --> 00:06:25,600 el hecho de que son una especie de métodos anónimos, 110 00:06:25,760 --> 00:06:27,800 esto es, cierres léxicos; 111 00:06:27,960 --> 00:06:31,960 pueden almacenarse en variables ya que son como cualquier otro objeto. 112 00:06:32,120 --> 00:06:37,400 En otras lecciones, veremos que los bloques son la base de muchas construcciones 113 00:06:37,560 --> 00:06:40,440 como ciclos, iteraciones, etc.