La clase String también hereda el comportamiento de sus
clases ancestrales. De hecho, String es una subclase de
CharacterSequence, que a su vez es una subclase de SequenceCollection. La consecuencia directa es que, al buscar un
comportamiento específico, es posible que también tengas que explorar
las clases padre. El comportamiento completo de una clase, definido en
la propia clase y en sus padres, se denomina su protocolo.
De nuevo, el Borwser es muy útil para explorar el protocolo de clase. Tienes dos opciones:
String → botón
derecho del ratón → Browse protocol (p)... Como
alternativa, utiliza el atajo de teclado Ctrl-p.
Figura 4.1: Ojear el protocolo de Browse String
La nueva ventana en un Browser de protocolos para la clase
String. A la izquierda vemos la jerarquía con las clases
ancestro de String. A la derecha están los selectores de
método de las cadenas y, entre paréntesis, la clase en la que están
definidos. Los métodos definidos en la propia clase String se
muestran en negrita.
Al seleccionar una clase allí, solo se muestra el protocolo desde esa
clase hasta la clase String. Si seleccionas String en
el panel izquierdo, solo verá los métodos definidos en la propia
clase String.
En la Figura 4.1,no está seleccionada ninguna clase
específica, por lo tanto se muestra todo el protocolo de
String a la derecha. Está seleccionado el método
before: implementado en SequenceableCollection y su
código fuente se muestra en el amplio panel inferior.
String → botón
derecho del ratón → Browse hierarchy (h)... De manera
alternativa, puedes usar la combinación de teclas Ctrl-h o
el botón hierarchy en el browser del sistema.
Figura 4.2: Ojear la jerarquía de String
El browser de jerarquía es muy similar al browser del sistema con dos diferencias:
String. Hace muy fácil visualizar las clases
antecesoras o descendientes de String.
El browser de jerarquía es una herramienta general de exploracion. A
diferencia del browser de protocolo, no muestra el protoco completo de
una clase. No se muestran los métodos heredados, sólo los definidos
directamente en la clase seleccionada. En la Figura 4.2,
está seleccionada la clase SequenceableCollection en su método
before:.
El método before: extrae de una colección el elemento anterior
al elemento especificado. Cuando se hereda en la clase String,
estos elementos son instancias de Character:
'1 + 3i' before: $i ⇒ $3
Practica las herramientas y resuelve el siguiente ejercicio.
Encuentra el método apropiado para transformar ’Hello My Friend’ en ’My Friend’.
Ejercicio 4.1: Cortar una cadena
Ten en cuenta que algunos mensajes del protocolo String
pueden no funcionar. Observa a continuación que se produce un error en
una instancia Character:
'Hello My Friend' cos ⇒ MesageNotUnderstood: Character>>cos
Si observas los implementadores de cos, verás que
Collection espera aplicar cos a cada miembro de una
colección, por lo que se solicita el coseno de un carácter.
Símbolo. Un símbolo es muy similar a una cadena, pero es único
y nunca se duplica. Dos referencias a 'hello' pueden corresponder a
dos objetos o a uno solo, dependiendo del historial computacional. Dos
referencias a #hello siempre se refieren al mismo objeto.
Los símbolos reciben ese nombre porque se utilizan como constantes simbólicas. Ya has observado cómo en el libro escribimos los selectores de mensajes como símbolos. Utilizamos símbolos porque cada nombre de mensaje debe indexar de forma única el código de un método. Utilizarás un símbolo cuando necesites nombrar algo de forma única.
En el ejemplo siguiente, observa el mismo comportamiento con cadena:
'hello' == 'hello' copy ⇒ false #hello == #hello copy ⇒ true
Ahora ya sabes. Un símbolo no se puede duplicar ni cambiar. Los símbolos pueden contener espacios:
'hello my friend' asSymbol ⇒ #'hello my friend'
Symbol es una subclase de String y gran parte de su
comportamiento es heredado. A medida que aprendemos sobre
Strings, también aprendemos bastante sobre los símbolos.
Ten en cuenta que muchos métodos @.class String@ están definidos para devolver cadenas.
'hello my friend' class. ⇒ String #'hello my friend' class. ⇒ Symbol #'hello my friend' asCamelCase ⇒ 'helloMyFriend' #'hello my friend' asCamelCase asSymbol ⇒ #helloMyFriend