Hola.
Hoy revisaremos la implementación de ifTrue:ifFalse:
Si has estado atento y estoy seguro de que si,
seguramente te has dado cuenta que cuando sugerí ejemplos para Not,
dije que podrías implementar Not, or: e ifTrue:ifFalse:
Pero en la solución, nunca mencioné ifTrue:ifFalse:
Solucionaremos este problema ahora.
En efecto, en Pharo, las condiciones son mensajes.
Aquí hay un ejemplo.
Tenemos una clase de clima: "Weather isRaining".
Esto significa que si llueve ...
Si es verdad, tomaré mi paraguas.
Si es falso, tomaré mis gafas de sol.
Con ifTrue:ifFalse:
Ves los dos puntos? Esto significa que son mensajes de palabra clave.
El mensaje ifTrue:ifFalse: es un mensaje de palabra clave
y se envía a una instancia booleana.
En realidad, está muy optimizado por el compilador y no se envia realmente,
pero conceptualmente lo es.
Entonces, si quieres redefinir el método ifTrue:
iffalse:
Puedes hacer esto en Pharo.
Explicaré la técnica ahora.
ifTrue:ifFalse: es tan importante
y lo necesitamos para ir tan rápido,
que la método en realidad no se invoca.
El compilador hace saltos en su lugar.
Pero para el propósito de esta clase, veremos cómo funciona.
Te quiero para proponer una implementación.
Sabes sobre bloques.
Sabes lo que hicimos con True y False,
y con Or y Not.
Puedes hacerlo con ifTrue:ifFalse:
En resumen, si mi receptor es falso, retorno 5.
Y si mi receptor es verdaero, retorno 3.
Una vez más, tenemos objetos, mensajes y bloques.
Es un poco repetitivo, pero así es como es.
Recuerda que los corchetes ...
congelan la ejecución
de la expresión que contienen,
y que "value" inicia la ejecución del código congelado.
Con esto, y Not y Or,
deberías poder implementar tus condiciones.
Del mismo modo, deberías ser capaz de implementar ifTrue:ifFalse:
Te daré unos segundos para pensar.
¿Cómo se implementa?
Exactamente de la misma manera que Or y Not.
En la clase True, tengo un método llamado
ifTrue:ifFalse: y dos argumentos.
Un bloque para True y un bloque para False.
¿Qué debo hacer?
Cuando estoy en True, ejecuto el bloque verdadero
Y cuando estoy en la clase False,
tengo el mismo método con los mismos dos argumentos,
pero como estoy en la clase False, ejecuto el bloque falso.
Tengo la implementación de los booleanos.
¿Como funciona?
Como esto.
Cuando envío un mensaje a mi booleano,
que de hecho es True,
envío si es verdad hacer algo cierto o hacer algo falso.
Luego busco ifTrue:ifFalse: en la clase True,
está aqui mismo.
Dice que ejecute el bloque verdadero, asi que lo hago.
Ahora envío el mensaje "B is a boolean: False".
Envío el mensaje y miro aquí. Encuentro ifTrue:ifFalse:
Dice que ejecute el bloque falso, y eso es lo que hago.
No puedes probar esto poniendo un punto de ruptura en ifTrue:ifFalse:
Está optimizado y el sistema no lo aceptará.
Pero lo que sí sugiero que intentes, es implementar del mismo modo:
ifFalse: o ifTrue:
ifTrue: aBlock1,
y ifFalse: aBlock2. Luego implementalas.
Usa un punto de interrupción y experimente.
Entonces, ¿qué hemos mostrado con este ejemplo?
Vimos que enviar un mensaje selecciona el método correcto.
Aquí decidimos dejar que el receptor decida su comportamiento.
Y vimos que los paréntesis congelan el cómputo,
y que "value" fuerza la ejecución del código congelado.