4.1 String – una colección particular

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:

  1. Explorar el protocolo. En el panel de clases del Browser, hacer ...selecciona la clase String → botón derecho del ratón → Browse protocol (p)... Como alternativa, utiliza el atajo de teclado Ctrl-p.
    ch03-browseProtocol

    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.

  2. Explorar la jerarquía. En el panel de clases del Browser, hacer ...seleccionar la clase 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.
    ch03-browseHierarchy

    Figura 4.2: Ojear la jerarquía de String

    El browser de jerarquía es muy similar al browser del sistema con dos diferencias:

    • En el extremo izquierdo está ausente el panel de categorías de clases,
    • En el panel de las clases, se muestra la jerarquía de 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.

 CuisLogo 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