1 00:00:00,600 --> 00:00:01,640 Hola a todos. 2 00:00:01,800 --> 00:00:04,400 Hoy estamos hablando errores frecuentemente realizados 3 00:00:04,560 --> 00:00:08,360 por desarrolladores de Pharo incluido yo mismo. 4 00:00:08,520 --> 00:00:12,520 Veremos cómo encontrar y arreglar errores comunes más rápido 5 00:00:13,560 --> 00:00:16,280 Aquí tenemos un poco de código. 6 00:00:16,440 --> 00:00:20,000 Cuando se ejecuta, se abre un depurador 7 00:00:21,080 --> 00:00:24,880 y nos dice que el mensaje "self" ha sido enviado a un objeto 8 00:00:25,040 --> 00:00:27,680 y este objeto no Entiende el mensaje "yo". 9 00:00:27,840 --> 00:00:32,400 Podríamos decir que "yo" No es un mensaje que se envía con mucha frecuencia, 10 00:00:32,560 --> 00:00:36,120 así que probablemente haya un error en algún lugar del código. 11 00:00:36,280 --> 00:00:38,680 Echándolo un poco, 12 00:00:39,840 --> 00:00:41,800 vemos que falta un período, 13 00:00:42,760 --> 00:00:45,800 y asi la ejecucion está sucediendo como si 14 00:00:45,960 --> 00:00:50,360 "self" fue un mensaje enviado como resultado de "DiceHandle new". 15 00:00:50,520 --> 00:00:53,640 Desde la clase DiceHandle no tiene un método de "auto" 16 00:00:53,800 --> 00:00:56,000 el depurador se abre. 17 00:00:57,560 --> 00:01:02,240 Entonces, la solución es agregar este período Al final de la primera línea. 18 00:01:03,720 --> 00:01:06,600 Otro problema que a menudo vemos 19 00:01:06,760 --> 00:01:11,920 son mensajes que no deberían teóricamente Se combinan que se combinan. 20 00:01:12,080 --> 00:01:16,280 Entonces aquí tenemos un error que dice que "incluye:ifTrue no existe". 21 00:01:16,440 --> 00:01:19,400 "Incluye" existe, "ifTrue" existe, "Incluye:IfTrue" no lo hace. 22 00:01:19,560 --> 00:01:21,560 Mirando más de cerca, 23 00:01:21,880 --> 00:01:24,720 nos damos cuenta de que de hecho 24 00:01:24,880 --> 00:01:27,240 el mensaje se está enviando "Incluye:ifTrue" 25 00:01:27,720 --> 00:01:32,120 al receptor "x" con 2 parámetros, "33" y un bloque, 26 00:01:32,320 --> 00:01:34,320 y eso no funciona 27 00:01:34,480 --> 00:01:36,600 Cuando Pharo ve una palabra clave, 28 00:01:36,760 --> 00:01:39,120 trata de ver todas las palabras clave subsiguientes. 29 00:01:39,280 --> 00:01:41,880 Se los lleva a todos y lo considera como un mensaje. 30 00:01:42,040 --> 00:01:44,160 Entonces, ¿qué falta aquí? 31 00:01:44,320 --> 00:01:45,920 es un par de paréntesis para decir 32 00:01:46,080 --> 00:01:49,480 que se envía el mensaje "ifTrue" Como resultado de "x incluye:33". 33 00:01:50,520 --> 00:01:54,440 Del mismo modo, "afirmar:incluye no existe", 34 00:01:54,600 --> 00:01:57,760 lo que queríamos hacer era "afirmar en el resultado de includes", 35 00:01:57,920 --> 00:02:01,440 entonces faltan paréntesis aquí. 36 00:02:02,040 --> 00:02:05,680 No dudes en poner paréntesis cuando tengas 37 00:02:05,880 --> 00:02:09,280 múltiples mensajes de palabras clave en la misma expresión, 38 00:02:09,440 --> 00:02:13,200 para delimitarlos, porque Pharo intentará agrupar palabras clave juntas 39 00:02:13,360 --> 00:02:16,160 y considérelo como un mensaje. 40 00:02:16,400 --> 00:02:18,600 En este ejemplo, 41 00:02:19,080 --> 00:02:23,320 queremos tener una colección de números en números, 42 00:02:23,480 --> 00:02:27,720 y por el momento, solo hay un número allí, 35. 43 00:02:27,880 --> 00:02:33,000 Sin embargo, si vemos lo que está en números, No es una colección, es el número. 44 00:02:33,160 --> 00:02:35,840 Es el número 35, así que hay un problema. 45 00:02:37,200 --> 00:02:41,240 De la misma manera, en este código, 46 00:02:41,400 --> 00:02:45,120 si envío el mensaje "nuevo" a la clase de dados 47 00:02:45,280 --> 00:02:47,400 Obtengo el numero 6 48 00:02:47,600 --> 00:02:49,200 en lugar de un dado de 6 caras. 49 00:02:49,600 --> 00:02:52,200 Es el mismo problema en ambos ejemplos. 50 00:02:52,360 --> 00:02:54,360 Si miramos más de cerca, 51 00:02:54,520 --> 00:02:57,880 agregando "usted mismo" después de "agregar" 52 00:02:58,040 --> 00:02:59,520 corregirá el problema ¿Por qué? 53 00:02:59,720 --> 00:03:02,280 Porque "agregar" devuelve su configuración. 54 00:03:03,000 --> 00:03:05,560 Entonces "OrderedCollection new add:35" 55 00:03:05,720 --> 00:03:07,920 regresa 35 56 00:03:08,080 --> 00:03:12,000 Si agregamos la cadena a "usted mismo" estamos seguros de recibir al receptor al final 57 00:03:12,160 --> 00:03:14,200 y los números serán una colección de números 58 00:03:14,840 --> 00:03:15,960 Entonces la solución aquí 59 00:03:16,160 --> 00:03:20,640 es agregar "tu mismo" Al final de cada mensaje. 60 00:03:21,560 --> 00:03:22,680 Aquí hay otro problema. 61 00:03:22,880 --> 00:03:26,000 Aquí tenemos una clase de libro en el método "Pedir prestado". 62 00:03:26,160 --> 00:03:29,200 Cuando lo ejecutamos, recibimos el mensaje 63 00:03:29,360 --> 00:03:32,040 que "nada entiende si falla". 64 00:03:32,200 --> 00:03:35,960 Entonces enviamos el mensaje "ifFalse" aquí a cero. 65 00:03:36,120 --> 00:03:38,440 Qué significa eso? Significa que en la biblioteca 66 00:03:38,600 --> 00:03:41,360 al valor cero, que tiene el valor predeterminado de todas las variables, 67 00:03:41,520 --> 00:03:46,360 podemos decir que probablemente "inLibrary" nunca se ha inicializado. 68 00:03:46,520 --> 00:03:51,440 Tenemos que poner un valor predeterminado en esa variable 69 00:03:51,600 --> 00:03:53,960 Es bastante fácil de corregir 70 00:03:54,120 --> 00:03:56,240 Al agregar el método "inicializar", 71 00:03:56,400 --> 00:04:01,880 que desde la creación de cada uno instancia de la clase Libro 72 00:04:02,040 --> 00:04:04,480 pondrá el valor "Verdadero" 73 00:04:04,640 --> 00:04:07,280 en la variable de instancia en la biblioteca. 74 00:04:07,640 --> 00:04:09,680 Excepto que si ejecutamos este código ahora, 75 00:04:09,880 --> 00:04:12,280 obtendremos otro mensaje de error, 76 00:04:12,440 --> 00:04:16,800 "Clase verdadera no entiende si falso ". 77 00:04:17,520 --> 00:04:21,200 ¿De donde viene esto? Es porque, lo que ponemos aquí, 78 00:04:21,360 --> 00:04:23,040 es una clase 79 00:04:23,200 --> 00:04:25,400 No es un booleano, es una clase. 80 00:04:26,040 --> 00:04:29,360 El booleano es "verdadero" con una pequeña "t". 81 00:04:30,480 --> 00:04:34,880 Las clases generalmente tienen una letra mayúscula, 82 00:04:35,040 --> 00:04:37,280 así que "Verdadero" con un capital es una clase, 83 00:04:37,440 --> 00:04:41,240 y "verdadero" con una pequeña "t" es la instancia única de la clase True. 84 00:04:42,000 --> 00:04:43,920 Aquí hay otro problema. 85 00:04:44,240 --> 00:04:46,840 En el método "roll" en la clase de dados que esperamos, 86 00:04:47,000 --> 00:04:49,760 cuando rodamos un dado, para obtener un número 87 00:04:49,920 --> 00:04:52,520 entre 1 y el número de caras en el dado, 88 00:04:52,680 --> 00:04:56,280 excepto que aquí, cuando rodamos el dado obtenemos un dado 89 00:04:56,440 --> 00:05:00,200 y no la cara en la que aterrizamos. 90 00:05:01,200 --> 00:05:05,520 El método que acabo de mostrar es equivalente al método a continuación. 91 00:05:05,800 --> 00:05:10,760 Esto significa que, por defecto, un método que devuelve nada devuelve "yo". 92 00:05:11,680 --> 00:05:15,680 Esto significa nuestro método de "rollo" cuando se ejecuta, devuelve el dado 93 00:05:15,840 --> 00:05:18,360 y no el resultado de enviar "roll" ... 94 00:05:20,040 --> 00:05:24,120 No es el resultado de enviar "atRandom" a la colección "caras" 95 00:05:24,920 --> 00:05:27,360 Entonces el mismo problema en un ejemplo un poco diferente. 96 00:05:27,800 --> 00:05:31,200 Aquí, estamos creando un nuevo método, 97 00:05:31,360 --> 00:05:33,400 en la clase de dados, 98 00:05:33,560 --> 00:05:35,080 por lo que en la clase de dados, 99 00:05:35,240 --> 00:05:39,400 queremos hacer un nuevo método para crear instancias en la clase Dados, 100 00:05:39,560 --> 00:05:43,120 que inicializa por defecto El número de caras en cero. 101 00:05:44,120 --> 00:05:46,880 Si enviamos el mensaje "nuevo" a la clase de dados, 102 00:05:47,040 --> 00:05:49,480 lo que obtendremos es la clase de dados en sí 103 00:05:49,640 --> 00:05:52,120 en lugar de una nueva instancia de la clase de dados. 104 00:05:53,040 --> 00:05:54,080 Entonces, en ambos casos, 105 00:05:54,280 --> 00:05:56,760 el hecho de que no hay retorno en "self return" 106 00:05:56,920 --> 00:06:01,240 y "self" por defecto es el receptor, en el caso de un método de clase 107 00:06:01,400 --> 00:06:02,760 "yo" es la clase. 108 00:06:03,200 --> 00:06:04,920 Para corregir estos 2 problemas, 109 00:06:05,560 --> 00:06:09,520 solo tenemos que agregar el cursor ^ para volver a un valor específico. 110 00:06:11,200 --> 00:06:12,160 Problema siguiente 111 00:06:12,600 --> 00:06:15,480 si este código se ejecuta, 112 00:06:15,640 --> 00:06:20,520 el sistema parece estar congelado y no pasa nada más 113 00:06:20,680 --> 00:06:23,360 Es imposible interactuar con Pharo. 114 00:06:23,960 --> 00:06:25,120 ¿Qué causa este problema? 115 00:06:25,440 --> 00:06:29,000 Viene del hecho de que estamos implementando un nuevo método 116 00:06:29,160 --> 00:06:31,920 en la clase de dados 117 00:06:33,200 --> 00:06:36,280 "Sí" es dados 118 00:06:36,440 --> 00:06:40,960 y así "auto nuevo" se llamará recursivamente. 119 00:06:41,320 --> 00:06:42,680 La intención aquí 120 00:06:43,280 --> 00:06:46,640 es usar la creación de instancia por defecto 121 00:06:46,800 --> 00:06:48,560 definido en la superclase Dados, 122 00:06:48,720 --> 00:06:51,400 y luego agregar cosas en relación a eso 123 00:06:51,560 --> 00:06:53,920 Al escribir así, tenemos un bucle infinito, 124 00:06:54,640 --> 00:06:57,680 entonces tenemos que reemplazar "self" con "super" 125 00:06:57,840 --> 00:07:01,720 para solicitar la implementación de la superclase 126 00:07:03,000 --> 00:07:04,880 Lo que deberías saber, 127 00:07:06,520 --> 00:07:08,360 todos cometemos muchos errores. 128 00:07:08,520 --> 00:07:11,600 Los que te he mostrado se hacen con mucha frecuencia 129 00:07:11,760 --> 00:07:13,800 por todos los desarrolladores de Pharo, 130 00:07:13,960 --> 00:07:17,880 así que hay cosas que encontramos muy frecuentemente: 131 00:07:18,040 --> 00:07:20,360 Períodos faltantes 132 00:07:20,520 --> 00:07:22,240 paréntesis, 133 00:07:22,400 --> 00:07:24,480 carets faltantes ^, 134 00:07:24,640 --> 00:07:26,160 y usted mismo". 135 00:07:26,840 --> 00:07:29,800 Intenta usar el depurador todo lo que puedas para encontrar 136 00:07:30,000 --> 00:07:33,280 La raíz de los problemas. Realmente te ayudará. 137 00:07:33,440 --> 00:07:36,040 No lo cierre tan pronto como se abra. 138 00:07:36,200 --> 00:07:39,520 Te vas a perder en una forma de solucionar problemas.