Hoy vamos a revisar algo que ya has aprendido,
pero realmente quiero llevarlo a casa.
Caracteres, Strings y Símbolos.
Lo que vas a aprender es como manejar caracteres,
cómo se representan los strings,
y que es un símbolo en relación con un string.
Empecemos desde el principio: Caracteres.
En Pharo, los caracteres comienzan con el signo de dólar,
seguido de una letra.
Esto es para representar caracteres literales.
Para los caracteres no imprimibles que no tienen una forma
como el espacio, la tabulación y el retorno de carro,
que salta a una nueva línea,
enviamos un mensaje a la clase Character
para obtener este caracter.
Ahora strings.
Los strings están delimitados por comillas simples.
Este caracter aquí mismo.
Aquí tenemos el string: 'eclair au chocolat'.
Comienza aquí y termina aquí.
Podemos enviarle un mensaje, por ejemplo, size.
Y devuelve "18".
De hecho, este string contiene 18 caracteres.
Incluso podemos jugar con el.
Puedo decir "Character space split" .
Esto significa que cortaré este string de acuerdo con los espacios,
y obtengo una colección con 3 elementos.
El string se cortó en 3 elementos.
Los strings son colecciones como cualquier otra en Pharo.
Un string es realmente una colección de caracteres,
y la clase String hereda de la clase Collection.
Entonces puedo usar todos los métodos clásicos.
Recuerda, Tenemos mensajes comunes de Collection.
Por ejemplo, "at:" para todas las colecciones indexadas.
'eclair au chocolat' at: 1
significa que quiero el elemento "1" de esta colección y obtengo "e".
Corresponde a esta "e".
También puedo usar "do:" que se ejecuta para cada elemento de una colección.
Y después de cada ciclo, el bloque
se evalua con el primer elemento de la colección, luego el segundo, etc.
Una pequeña sutileza.
Dado que los strings están delimitados por comillas simples,
si quiero poner una comilla simple en un string,
el truco es usar dos comillas, lado a lado.
Esto significa que quiero insertar una comilla en mi string ...
Pero ten cuidado, la sutileza es que
solo cuenta como un elemento en la cadena.
Por ejemplo: 'L'' eclair au chocolat ' at: 2
significa que quiero el elemento 2 de esta colección.
Y devuelve el caracter '.
Y si le pido at: 3 recibo la "e" que está aquí.
Entonces, incluso si ingrese dos comillas simples, cuentan como una.
Los strings se tratan como cualquier otra colección.
Puedo decir que quiero el último elemento.
Si pido "str at: str size" recibo el último elemento.
No te olvides, en Pharo las colecciones se indexas desde 1,
por lo tanto, el último elemento es el tamaño del string.
O simplemente podemos usar "last" para recuperar el último elemento.
Para generar strings, hay varias técnicas
La más fácil es el método de conversión.
Convierto un símbolo en un string con "asString".
O bien, puedo enviar printString a cualquier objeto.
Esto me dará una representación en string del objeto.
O puedo generar un método de creación directamente de una colección.
Recuerde, puede enviar "with:" a cualquier clase de colección
para generar una nueva colección que automáticamente contiene ciertos objetos.
Si uso String with: $A,
Obtengo un string que contiene un solo carácter: "A"
Para la concatenación,
ya has visto esto, utilizamos el mensaje coma.
Envío "," a un string y con otro string
para crear uno nuevo que sea la concatenación de los dos.
Sin embargo, ten cuidado.
Si tomo el mismo ejemplo, Debes entender
que generé versiones intermedias que son inútiles.
Entonces tengo este primer mensaje eso fue enviado
a este string, con este valor.
Tenemos una primer string concatenado que fue generado
Esta concatenación envia el mensaje "," con este valor,
y se creó otro string: El resultado final
Se generó un string intermedio que no hemos visto,
y te hace perder tiempo en los cálulos.
Tuve una sesión sobre benchmarking.
Puedes usar benchmarking para ver realmente lo que está pasando
y si vale la pena usar un Stream.
Genero un string
y digo que definiré una streamContent with: s
Y puedo enviar strings directamente a este stream para generar el final.
De esta forma, evito los strings intermedios.
Ahora con los símbolos.
Sintácticamente hablando, los símbolos comienzan con un hashtag,
luego un string.
Este es un símbolo literal.
Es una especie de string, pero ten cuidado, son únicos en el sistema.
Si escribo el hashtag "bla, bla" en cualquier parte de mi programa,
en cualquier otro lugar en el programa esto aparece,
estoy designando el mismo objeto.
Es la misma instancia.
Entonces, los símbolos son únicos.
Aquí tenemos #calvin == #calvin y devuelve verdadero.
Es el mismo objeto.
Este no es el caso de los strings. Para strings, depende.
Depende de las optimizaciones del compilador.
Entonces esta es la verdadera diferencia. entre símbolos y strings.
Un símbolo existe únicamente en solo lectura.
Los símbolos no se pueden modificar, debes crear uno nuevo.
Es un objeto único, por lo que siempre apunta al mismo objeto.
Los strings son objetos mutables, puedes modificar su contenido.
Dice "por ahora" porque este punto está en discusión.
Los símbolos se usan a menudo como
selectores de métodos.
Y son buenos candidatos para claves
en diccionarios,
sobre todo en IdentityDictionary
¿Recuerdas esto?
Comparamos elementos,
y podemos fácilmente para calcular hashes que comienzan con un símbolo,
para generarlo en un diccionario.
Lo importante para recordar de esta sesión,
es que los strings son como cualquier otra colección.
Y que los símbolos son únicos,
de solo lectura, e inmutables.