Hola a todos.
Hoy estamos hablando errores frecuentemente realizados
por desarrolladores de Pharo incluido yo mismo.
Veremos cómo encontrar y arreglar errores comunes más rápido
Aquí tenemos un poco de código.
Cuando se ejecuta, se abre un depurador
y nos dice que el mensaje "self" ha sido enviado a un objeto
y este objeto no Entiende el mensaje "yo".
Podríamos decir que "yo" No es un mensaje que se envía con mucha frecuencia,
así que probablemente haya un error en algún lugar del código.
Echándolo un poco,
vemos que falta un período,
y asi la ejecucion está sucediendo como si
"self" fue un mensaje enviado como resultado de "DiceHandle new".
Desde la clase DiceHandle no tiene un método de "auto"
el depurador se abre.
Entonces, la solución es agregar este período Al final de la primera línea.
Otro problema que a menudo vemos
son mensajes que no deberían teóricamente Se combinan que se combinan.
Entonces aquí tenemos un error que dice que "incluye:ifTrue no existe".
"Incluye" existe, "ifTrue" existe, "Incluye:IfTrue" no lo hace.
Mirando más de cerca,
nos damos cuenta de que de hecho
el mensaje se está enviando "Incluye:ifTrue"
al receptor "x" con 2 parámetros, "33" y un bloque,
y eso no funciona
Cuando Pharo ve una palabra clave,
trata de ver todas las palabras clave subsiguientes.
Se los lleva a todos y lo considera como un mensaje.
Entonces, ¿qué falta aquí?
es un par de paréntesis para decir
que se envía el mensaje "ifTrue" Como resultado de "x incluye:33".
Del mismo modo, "afirmar:incluye no existe",
lo que queríamos hacer era "afirmar en el resultado de includes",
entonces faltan paréntesis aquí.
No dudes en poner paréntesis cuando tengas
múltiples mensajes de palabras clave en la misma expresión,
para delimitarlos, porque Pharo intentará agrupar palabras clave juntas
y considérelo como un mensaje.
En este ejemplo,
queremos tener una colección de números en números,
y por el momento, solo hay un número allí, 35.
Sin embargo, si vemos lo que está en números, No es una colección, es el número.
Es el número 35, así que hay un problema.
De la misma manera, en este código,
si envío el mensaje "nuevo" a la clase de dados
Obtengo el numero 6
en lugar de un dado de 6 caras.
Es el mismo problema en ambos ejemplos.
Si miramos más de cerca,
agregando "usted mismo" después de "agregar"
corregirá el problema ¿Por qué?
Porque "agregar" devuelve su configuración.
Entonces "OrderedCollection new add:35"
regresa 35
Si agregamos la cadena a "usted mismo" estamos seguros de recibir al receptor al final
y los números serán una colección de números
Entonces la solución aquí
es agregar "tu mismo" Al final de cada mensaje.
Aquí hay otro problema.
Aquí tenemos una clase de libro en el método "Pedir prestado".
Cuando lo ejecutamos, recibimos el mensaje
que "nada entiende si falla".
Entonces enviamos el mensaje "ifFalse" aquí a cero.
Qué significa eso? Significa que en la biblioteca
al valor cero, que tiene el valor predeterminado de todas las variables,
podemos decir que probablemente "inLibrary" nunca se ha inicializado.
Tenemos que poner un valor predeterminado en esa variable
Es bastante fácil de corregir
Al agregar el método "inicializar",
que desde la creación de cada uno instancia de la clase Libro
pondrá el valor "Verdadero"
en la variable de instancia en la biblioteca.
Excepto que si ejecutamos este código ahora,
obtendremos otro mensaje de error,
"Clase verdadera no entiende si falso ".
¿De donde viene esto? Es porque, lo que ponemos aquí,
es una clase
No es un booleano, es una clase.
El booleano es "verdadero" con una pequeña "t".
Las clases generalmente tienen una letra mayúscula,
así que "Verdadero" con un capital es una clase,
y "verdadero" con una pequeña "t" es la instancia única de la clase True.
Aquí hay otro problema.
En el método "roll" en la clase de dados que esperamos,
cuando rodamos un dado, para obtener un número
entre 1 y el número de caras en el dado,
excepto que aquí, cuando rodamos el dado obtenemos un dado
y no la cara en la que aterrizamos.
El método que acabo de mostrar es equivalente al método a continuación.
Esto significa que, por defecto, un método que devuelve nada devuelve "yo".
Esto significa nuestro método de "rollo" cuando se ejecuta, devuelve el dado
y no el resultado de enviar "roll" ...
No es el resultado de enviar "atRandom" a la colección "caras"
Entonces el mismo problema en un ejemplo un poco diferente.
Aquí, estamos creando un nuevo método,
en la clase de dados,
por lo que en la clase de dados,
queremos hacer un nuevo método para crear instancias en la clase Dados,
que inicializa por defecto El número de caras en cero.
Si enviamos el mensaje "nuevo" a la clase de dados,
lo que obtendremos es la clase de dados en sí
en lugar de una nueva instancia de la clase de dados.
Entonces, en ambos casos,
el hecho de que no hay retorno en "self return"
y "self" por defecto es el receptor, en el caso de un método de clase
"yo" es la clase.
Para corregir estos 2 problemas,
solo tenemos que agregar el cursor ^ para volver a un valor específico.
Problema siguiente
si este código se ejecuta,
el sistema parece estar congelado y no pasa nada más
Es imposible interactuar con Pharo.
¿Qué causa este problema?
Viene del hecho de que estamos implementando un nuevo método
en la clase de dados
"Sí" es dados
y así "auto nuevo" se llamará recursivamente.
La intención aquí
es usar la creación de instancia por defecto
definido en la superclase Dados,
y luego agregar cosas en relación a eso
Al escribir así, tenemos un bucle infinito,
entonces tenemos que reemplazar "self" con "super"
para solicitar la implementación de la superclase
Lo que deberías saber,
todos cometemos muchos errores.
Los que te he mostrado se hacen con mucha frecuencia
por todos los desarrolladores de Pharo,
así que hay cosas que encontramos muy frecuentemente:
Períodos faltantes
paréntesis,
carets faltantes ^,
y usted mismo".
Intenta usar el depurador todo lo que puedas para encontrar
La raíz de los problemas. Realmente te ayudará.
No lo cierre tan pronto como se abra.
Te vas a perder en una forma de solucionar problemas.