4.2 Diversión con variables

¿Cómo puede una variable ser divertida? Con Cuis-Smalltalk, una variable es el nombre de una caja que contiene un valor: un objeto, ¡eso es todo!

Una variable puede contener un valor de cualquier clase. El valor es fuertemente tipado (siempre podemos determinar su clase), pero la variable (caja) no está restringida a contener un valor de un único tipo.

Una consecuencia directa importante es que el tipo de una variable –es decir, la clase del objeto referenciado– puede cambiar en el tiempo. Observa este ejemplo:

| a |
a := 1 / 3.
a class
⇒ Fraction
a := a + (2 / 3)
⇒ 1
a class
⇒ SmallInteger

El valor iniciar de la variable a es una instancia de Fraction, después de algunos cálculos termina siendo una instancia de SmallInteger.

De hecho, no existe tal cosa como el tipo, solo hay objetos referenciados que pueden mutar con el tiempo en otro tipo de objeto: una estructura metálica a la que se le añaden dos ruedas puede convertirse en una bicicleta, o en un coche si se le añaden cuatro ruedas.

Por lo tanto, para declarar una variable de método, solo tenemos que nombrarla al principio del script y rodearla con caracteres de barra vertical «|».

Una variable siempre contiene un valor. Hasta que asignemos un valor diferente a una variable, esta contendrá el valor nil, una instancia de UndefinedObject. Cuando decimos que un valor está vinculado (bound) a una variable, queremos decir que el campo con ese nombre ahora contiene ese valor.

Hasta ahora hemos enviado mensajes directamente a objetos, pero también podemos enviar mensajes a una variable vinculada a un objeto.

Cualquier objeto responde al mensaje #printString.

| msg |
msg := 'hello world!'.
Transcript show: msg capitalized printString, ' is a kind of '.
Transcript show: msg class printString; newLine.
msg := 5.
Transcript show: msg printString, ' is a kind of '.
Transcript show: msg class printString; newLine.

 note Esta facilidad de uso tiene un inconveniente: al escribir código para enviar un mensaje a una variable vinculada a un objeto, el sistema no comprueba de antemano que el objeto comprenda el mensaje. No obstante, existe un procedimiento para detectar este tipo de situaciones cuando el mensaje se envía realmente.