1 00:00:00,560 --> 00:00:04,680 Hoy vamos a revisar algo que ya has aprendido, 2 00:00:04,840 --> 00:00:07,120 pero realmente quiero llevarlo a casa. 3 00:00:07,280 --> 00:00:09,920 Caracteres, Strings y Símbolos. 4 00:00:10,920 --> 00:00:14,560 Lo que vas a aprender es como manejar caracteres, 5 00:00:14,720 --> 00:00:16,360 cómo se representan los strings, 6 00:00:16,520 --> 00:00:19,160 y que es un símbolo en relación con un string. 7 00:00:19,520 --> 00:00:21,960 Empecemos desde el principio: Caracteres. 8 00:00:22,120 --> 00:00:25,920 En Pharo, los caracteres comienzan con el signo de dólar, 9 00:00:26,200 --> 00:00:28,600 seguido de una letra. 10 00:00:28,880 --> 00:00:32,680 Esto es para representar caracteres literales. 11 00:00:33,200 --> 00:00:36,960 Para los caracteres no imprimibles que no tienen una forma 12 00:00:37,120 --> 00:00:40,720 como el espacio, la tabulación y el retorno de carro, 13 00:00:40,880 --> 00:00:42,920 que salta a una nueva línea, 14 00:00:43,080 --> 00:00:46,200 enviamos un mensaje a la clase Character 15 00:00:46,360 --> 00:00:47,920 para obtener este caracter. 16 00:00:49,960 --> 00:00:51,160 Ahora strings. 17 00:00:51,320 --> 00:00:54,720 Los strings están delimitados por comillas simples. 18 00:00:54,880 --> 00:00:56,880 Este caracter aquí mismo. 19 00:00:57,040 --> 00:01:00,320 Aquí tenemos el string: 'eclair au chocolat'. 20 00:01:00,480 --> 00:01:02,440 Comienza aquí y termina aquí. 21 00:01:02,680 --> 00:01:05,520 Podemos enviarle un mensaje, por ejemplo, size. 22 00:01:05,680 --> 00:01:08,400 Y devuelve "18". 23 00:01:08,560 --> 00:01:11,760 De hecho, este string contiene 18 caracteres. 24 00:01:12,240 --> 00:01:14,320 Incluso podemos jugar con el. 25 00:01:14,480 --> 00:01:16,880 Puedo decir "Character space split" . 26 00:01:17,120 --> 00:01:21,440 Esto significa que cortaré este string de acuerdo con los espacios, 27 00:01:21,600 --> 00:01:25,040 y obtengo una colección con 3 elementos. 28 00:01:25,200 --> 00:01:28,160 El string se cortó en 3 elementos. 29 00:01:28,960 --> 00:01:34,000 Los strings son colecciones como cualquier otra en Pharo. 30 00:01:34,160 --> 00:01:37,440 Un string es realmente una colección de caracteres, 31 00:01:37,600 --> 00:01:41,120 y la clase String hereda de la clase Collection. 32 00:01:41,560 --> 00:01:44,360 Entonces puedo usar todos los métodos clásicos. 33 00:01:44,520 --> 00:01:49,120 Recuerda, Tenemos mensajes comunes de Collection. 34 00:01:49,280 --> 00:01:52,960 Por ejemplo, "at:" para todas las colecciones indexadas. 35 00:01:53,120 --> 00:01:55,240 'eclair au chocolat' at: 1 36 00:01:55,400 --> 00:01:59,160 significa que quiero el elemento "1" de esta colección y obtengo "e". 37 00:01:59,520 --> 00:02:01,480 Corresponde a esta "e". 38 00:02:02,480 --> 00:02:06,560 También puedo usar "do:" que se ejecuta para cada elemento de una colección. 39 00:02:06,720 --> 00:02:09,320 Y después de cada ciclo, el bloque 40 00:02:09,480 --> 00:02:13,960 se evalua con el primer elemento de la colección, luego el segundo, etc. 41 00:02:14,120 --> 00:02:15,640 Una pequeña sutileza. 42 00:02:15,800 --> 00:02:19,720 Dado que los strings están delimitados por comillas simples, 43 00:02:19,880 --> 00:02:22,200 si quiero poner una comilla simple en un string, 44 00:02:22,360 --> 00:02:24,960 el truco es usar dos comillas, lado a lado. 45 00:02:25,120 --> 00:02:29,960 Esto significa que quiero insertar una comilla en mi string ... 46 00:02:30,120 --> 00:02:32,440 Pero ten cuidado, la sutileza es que 47 00:02:32,600 --> 00:02:35,640 solo cuenta como un elemento en la cadena. 48 00:02:35,800 --> 00:02:39,720 Por ejemplo: 'L'' eclair au chocolat ' at: 2 49 00:02:39,880 --> 00:02:42,560 significa que quiero el elemento 2 de esta colección. 50 00:02:42,720 --> 00:02:45,040 Y devuelve el caracter '. 51 00:02:45,200 --> 00:02:49,160 Y si le pido at: 3 recibo la "e" que está aquí. 52 00:02:49,320 --> 00:02:54,640 Entonces, incluso si ingrese dos comillas simples, cuentan como una. 53 00:02:56,800 --> 00:03:01,240 Los strings se tratan como cualquier otra colección. 54 00:03:01,400 --> 00:03:05,440 Puedo decir que quiero el último elemento. 55 00:03:05,600 --> 00:03:10,320 Si pido "str at: str size" recibo el último elemento. 56 00:03:10,480 --> 00:03:13,960 No te olvides, en Pharo las colecciones se indexas desde 1, 57 00:03:14,120 --> 00:03:17,400 por lo tanto, el último elemento es el tamaño del string. 58 00:03:17,640 --> 00:03:22,320 O simplemente podemos usar "last" para recuperar el último elemento. 59 00:03:22,840 --> 00:03:26,200 Para generar strings, hay varias técnicas 60 00:03:26,360 --> 00:03:29,760 La más fácil es el método de conversión. 61 00:03:29,920 --> 00:03:33,560 Convierto un símbolo en un string con "asString". 62 00:03:33,720 --> 00:03:36,960 O bien, puedo enviar printString a cualquier objeto. 63 00:03:37,120 --> 00:03:41,200 Esto me dará una representación en string del objeto. 64 00:03:42,400 --> 00:03:46,240 O puedo generar un método de creación directamente de una colección. 65 00:03:46,400 --> 00:03:49,840 Recuerde, puede enviar "with:" a cualquier clase de colección 66 00:03:50,000 --> 00:03:54,640 para generar una nueva colección que automáticamente contiene ciertos objetos. 67 00:03:54,800 --> 00:03:56,600 Si uso String with: $A, 68 00:03:56,760 --> 00:04:00,520 Obtengo un string que contiene un solo carácter: "A" 69 00:04:00,680 --> 00:04:02,120 Para la concatenación, 70 00:04:02,280 --> 00:04:05,640 ya has visto esto, utilizamos el mensaje coma. 71 00:04:05,800 --> 00:04:09,640 Envío "," a un string y con otro string 72 00:04:09,800 --> 00:04:13,800 para crear uno nuevo que sea la concatenación de los dos. 73 00:04:14,560 --> 00:04:16,160 Sin embargo, ten cuidado. 74 00:04:16,320 --> 00:04:19,400 Si tomo el mismo ejemplo, Debes entender 75 00:04:19,560 --> 00:04:23,440 que generé versiones intermedias que son inútiles. 76 00:04:23,600 --> 00:04:27,440 Entonces tengo este primer mensaje eso fue enviado 77 00:04:27,600 --> 00:04:30,120 a este string, con este valor. 78 00:04:30,280 --> 00:04:34,600 Tenemos una primer string concatenado que fue generado 79 00:04:34,920 --> 00:04:38,800 Esta concatenación envia el mensaje "," con este valor, 80 00:04:38,960 --> 00:04:41,680 y se creó otro string: El resultado final 81 00:04:41,840 --> 00:04:45,280 Se generó un string intermedio que no hemos visto, 82 00:04:45,440 --> 00:04:48,680 y te hace perder tiempo en los cálulos. 83 00:04:48,840 --> 00:04:51,560 Tuve una sesión sobre benchmarking. 84 00:04:51,720 --> 00:04:55,840 Puedes usar benchmarking para ver realmente lo que está pasando 85 00:04:56,000 --> 00:04:59,240 y si vale la pena usar un Stream. 86 00:04:59,400 --> 00:05:02,000 Genero un string 87 00:05:02,160 --> 00:05:06,000 y digo que definiré una streamContent with: s 88 00:05:06,160 --> 00:05:11,320 Y puedo enviar strings directamente a este stream para generar el final. 89 00:05:11,480 --> 00:05:14,200 De esta forma, evito los strings intermedios. 90 00:05:14,360 --> 00:05:16,760 Ahora con los símbolos. 91 00:05:16,920 --> 00:05:21,200 Sintácticamente hablando, los símbolos comienzan con un hashtag, 92 00:05:21,360 --> 00:05:23,120 luego un string. 93 00:05:23,280 --> 00:05:24,880 Este es un símbolo literal. 94 00:05:25,040 --> 00:05:29,760 Es una especie de string, pero ten cuidado, son únicos en el sistema. 95 00:05:29,920 --> 00:05:33,200 Si escribo el hashtag "bla, bla" en cualquier parte de mi programa, 96 00:05:33,360 --> 00:05:36,320 en cualquier otro lugar en el programa esto aparece, 97 00:05:36,480 --> 00:05:38,760 estoy designando el mismo objeto. 98 00:05:38,920 --> 00:05:40,680 Es la misma instancia. 99 00:05:41,400 --> 00:05:43,640 Entonces, los símbolos son únicos. 100 00:05:43,800 --> 00:05:48,480 Aquí tenemos #calvin == #calvin y devuelve verdadero. 101 00:05:48,640 --> 00:05:50,120 Es el mismo objeto. 102 00:05:50,280 --> 00:05:53,760 Este no es el caso de los strings. Para strings, depende. 103 00:05:53,920 --> 00:05:57,000 Depende de las optimizaciones del compilador. 104 00:05:57,400 --> 00:06:01,440 Entonces esta es la verdadera diferencia. entre símbolos y strings. 105 00:06:01,600 --> 00:06:05,360 Un símbolo existe únicamente en solo lectura. 106 00:06:05,520 --> 00:06:08,600 Los símbolos no se pueden modificar, debes crear uno nuevo. 107 00:06:08,760 --> 00:06:13,080 Es un objeto único, por lo que siempre apunta al mismo objeto. 108 00:06:13,240 --> 00:06:17,440 Los strings son objetos mutables, puedes modificar su contenido. 109 00:06:17,600 --> 00:06:22,440 Dice "por ahora" porque este punto está en discusión. 110 00:06:24,080 --> 00:06:26,440 Los símbolos se usan a menudo como 111 00:06:27,560 --> 00:06:30,320 selectores de métodos. 112 00:06:31,480 --> 00:06:35,160 Y son buenos candidatos para claves 113 00:06:35,320 --> 00:06:37,160 en diccionarios, 114 00:06:37,320 --> 00:06:39,080 sobre todo en IdentityDictionary 115 00:06:39,240 --> 00:06:40,560 ¿Recuerdas esto? 116 00:06:40,720 --> 00:06:43,160 Comparamos elementos, 117 00:06:43,320 --> 00:06:48,600 y podemos fácilmente para calcular hashes que comienzan con un símbolo, 118 00:06:48,760 --> 00:06:51,200 para generarlo en un diccionario. 119 00:06:52,680 --> 00:06:56,360 Lo importante para recordar de esta sesión, 120 00:06:56,520 --> 00:07:00,120 es que los strings son como cualquier otra colección. 121 00:07:00,280 --> 00:07:03,360 Y que los símbolos son únicos, 122 00:07:03,520 --> 00:07:06,320 de solo lectura, e inmutables.