1 00:00:00,660 --> 00:00:02,380 Bonjour. Alors aujourd'hui on va revenir sur quelque 2 00:00:02,580 --> 00:00:04,220 chose que vous avez déjà vu dans les séquences 3 00:00:04,420 --> 00:00:07,130 précédentes, mais on va vraiment réefoncer le clou dans cette séquence. 4 00:00:07,390 --> 00:00:10,040 Donc les caractères, les chaines de caractères et les symboles. 5 00:00:11,120 --> 00:00:14,180 Ce que vous allez apprendre, c'est vraiment comment on 6 00:00:14,380 --> 00:00:15,900 manipule les caractères, comment sont représentés les 7 00:00:16,100 --> 00:00:17,440 chaines de caractères et qu'est-ce que c'est un symbole 8 00:00:17,640 --> 00:00:18,610 par rapport à une chaîne de caractères. 9 00:00:19,680 --> 00:00:21,840 Donc on revient à la base, les caractères. 10 00:00:22,040 --> 00:00:24,100 Donc les caractères en Pharo sont représentés, vous vous 11 00:00:24,300 --> 00:00:25,850 souvenez, on commence par un dollar suivi d'une lettre. 12 00:00:28,930 --> 00:00:31,560 Donc ça, c'est pour représenter les caractères sous forme littérale. 13 00:00:32,030 --> 00:00:35,220 D'accord. Et puis les caractères qu'on ne peut pas 14 00:00:35,420 --> 00:00:37,250 représenter, qui n'ont pas de formes représentables 15 00:00:37,450 --> 00:00:40,370 typiquement l'espace, le tab, le cr return, donc ça c'est 16 00:00:40,570 --> 00:00:42,490 le caractère qui permet de passer à la ligne. 17 00:00:43,240 --> 00:00:45,480 Donc en fait, on utilise la classe caractère auquel on va 18 00:00:45,680 --> 00:00:47,440 envoyer un message pour obtenir ce caractère-là. 19 00:00:50,100 --> 00:00:51,350 Donc les chaînes de caractères maintenant. 20 00:00:51,550 --> 00:00:53,430 Les chaînes de caractères en Pharo sont représentées donc 21 00:00:53,630 --> 00:00:56,570 entre simples côtes. Donc ici, c'est ce caractère-là. 22 00:00:57,150 --> 00:00:59,620 Donc ici, on a eu une chaîne de caractères éclair au 23 00:00:59,820 --> 00:01:02,480 chocolat qui commence ici et qui se termine ici. 24 00:01:02,790 --> 00:01:06,560 On peut lui envoyer un message Size, ça nous rend 25 00:01:07,700 --> 00:01:11,260 18. Donc cette chaîne de caractères contient bien 18 caractères. 26 00:01:12,330 --> 00:01:13,370 On peut manipuler cette chaîne de caractères. 27 00:01:13,840 --> 00:01:17,550 Par exemple, je peux dire caractère space split cette 28 00:01:17,750 --> 00:01:19,410 chaîne de caractères-là. Donc ça veut dire que je vais 29 00:01:19,610 --> 00:01:21,630 découper cette chaîne en fonction des espaces. 30 00:01:21,830 --> 00:01:24,890 Et ça va me rendre une collection ordonnée de 3 éléments. 31 00:01:25,270 --> 00:01:27,830 Donc la chaîne a bien été coupée en 3 éléments. 32 00:01:29,080 --> 00:01:31,180 Alors, en fait les chaînes de caractères sont des 33 00:01:31,380 --> 00:01:33,770 collections comme les autres en Pharo. 34 00:01:34,000 --> 00:01:37,820 Donc c'est vraiment une collection instance de la classe string. 35 00:01:38,020 --> 00:01:40,610 Mais la classe string va hériter des classes de collection. 36 00:01:41,690 --> 00:01:44,570 Donc je peux utiliser toutes les méthodes classiques. 37 00:01:44,770 --> 00:01:46,180 Vous vous souvenez sur les collections on a une API 38 00:01:46,380 --> 00:01:49,470 commune qui existe pour toutes les collections, donc par 39 00:01:49,670 --> 00:01:52,360 exemple, at pour toutes les collections indexées. 40 00:01:53,300 --> 00:01:56,290 Donc si je fais éclair au chocolat at 1, donc je veux l'élément 41 00:01:56,490 --> 00:01:58,720 1 de cette collection, ça me retourne bien le caractère E. 42 00:01:58,920 --> 00:02:01,210 D'accord qui était bien ce E là. 43 00:02:02,750 --> 00:02:05,290 Ensuite je peux utiliser do qui permet de parcourir l'ensemble 44 00:02:05,490 --> 00:02:06,380 des éléments d'une collection. 45 00:02:06,690 --> 00:02:09,020 Et donc à chaque tour de boucle, le paramètre du bloc ici 46 00:02:09,220 --> 00:02:11,870 vaudra le premier élément de la collection, le deuxième 47 00:02:12,070 --> 00:02:13,200 et caetera, jusqu'au bout. 48 00:02:14,120 --> 00:02:17,480 Donc petite subtilité, vu que les chaines de caractères 49 00:02:17,910 --> 00:02:19,660 sont définies par des simple côtes. 50 00:02:20,240 --> 00:02:21,780 Donc si je veux mettre des côtes dans une chaîne de 51 00:02:22,000 --> 00:02:23,920 caractères l'astuce c'est de les doubler. 52 00:02:24,120 --> 00:02:26,350 Si j'en mets 2 côte-à-côte, ça veut dire que je veux 53 00:02:26,550 --> 00:02:29,060 insérer une côte dans ma chaîne de caractère. 54 00:02:29,510 --> 00:02:33,010 D'accord. Par contre attention, la subtilité c'est qu'elle 55 00:02:33,210 --> 00:02:35,650 ne compte que pour un seul élément dans la chaîne de caractères. 56 00:02:35,910 --> 00:02:38,170 Donc ici vous avez l'exemple, si je fais l'éclair au 57 00:02:38,370 --> 00:02:41,340 chocolat at 2, d'accord. Donc, je veux l'élément 2 de 58 00:02:41,540 --> 00:02:44,750 cette collection, ça me retourne bien le caractère côte. 59 00:02:45,240 --> 00:02:49,590 Et si je demande at 3, ça me retourne le E qui est ici. 60 00:02:49,790 --> 00:02:53,060 D'accord. Donc même si on affiche 2 côtes, ça prend 61 00:02:53,260 --> 00:02:54,050 l'espace que pour une seule côte. 62 00:02:56,910 --> 00:02:59,630 Donc les chaînes de caractères sont des collections comme les autres. 63 00:02:59,830 --> 00:03:01,640 Donc je peux les manipuler comme des collections, je peux 64 00:03:01,840 --> 00:03:04,660 dire que je veux par exemple le dernier élément d'une 65 00:03:04,860 --> 00:03:08,710 chaîne de caractères, donc je fais str at str size, donc 66 00:03:09,250 --> 00:03:10,580 je récupère le dernier élément. 67 00:03:10,780 --> 00:03:13,500 Je vous rappelle en Pharo, les collections commencent à l'indice 68 00:03:13,700 --> 00:03:18,000 1, donc le dernier élément c'est la taille de la chaîne. 69 00:03:18,180 --> 00:03:19,630 Ou on peut utiliser la méthode plus simple qui est last 70 00:03:19,830 --> 00:03:21,950 pour récupérer directement le dernier élément de la collection. 71 00:03:22,900 --> 00:03:25,110 Donc pour créer des chaînes, on a plusieurs techniques 72 00:03:25,310 --> 00:03:27,110 pour créer des chaînes, on a la technique simple, c'est 73 00:03:27,310 --> 00:03:29,850 je prends un symbole et j'utilise une méthode de conversion. 74 00:03:30,050 --> 00:03:32,600 Donc je convertis ce symbole en chaîne de caractères avec 75 00:03:32,800 --> 00:03:35,520 asString, ou je peux envoyer printString à n'importe quel 76 00:03:35,720 --> 00:03:39,100 objet qui va permettre de récupérer une représentation 77 00:03:39,300 --> 00:03:40,800 sous-forme de chaîne de caractères de l'objet. 78 00:03:42,550 --> 00:03:45,190 Et puis, je peux créer une méthode de création 79 00:03:45,390 --> 00:03:47,360 directement d'une collection, vous vous souvenez on peut 80 00:03:47,560 --> 00:03:50,880 with à n'importe quelle classe de collection pour créer 81 00:03:51,080 --> 00:03:54,150 une nouvelle collection, contenant directement un certain 82 00:03:54,350 --> 00:03:56,000 objet à l'intérieur. Donc, si je fais string with le 83 00:03:56,200 --> 00:03:58,410 caractère A, ça va me retourner une chaîne de caractères 84 00:03:58,660 --> 00:04:00,240 qui ne contient qu'un seul caractère A. 85 00:04:00,910 --> 00:04:02,660 Pour concaténer des chaînes de caractères, on l'avait 86 00:04:02,860 --> 00:04:05,570 déjà vu, c'est le message virgule. 87 00:04:05,920 --> 00:04:07,620 Donc, je peux envoyer le message virgule à une chaîne de 88 00:04:07,820 --> 00:04:09,300 caractères et je passe en paramètre une autre chaîne de 89 00:04:09,500 --> 00:04:11,180 caractères, ça va m'en construire une nouvelle qui est la 90 00:04:11,380 --> 00:04:13,670 concaténation des 2, bien sûr je peux chaîner. 91 00:04:14,670 --> 00:04:18,220 Attention toutefois si je fais ça, donc si je reprends le 92 00:04:18,420 --> 00:04:21,240 même exemple, il faut bien comprendre qu'ici j'ai créé 93 00:04:21,440 --> 00:04:23,020 des chaînes intermédiaires inutiles. 94 00:04:23,720 --> 00:04:26,820 Donc en fait, j'ai ce premier message qui a été envoyé à 95 00:04:27,020 --> 00:04:30,950 cette chaîne-là, avec ce paramètre-là, donc on a une 96 00:04:31,150 --> 00:04:34,360 première chaîne ici concaténée qui a été créée, d'accord pour tout ça. 97 00:04:35,060 --> 00:04:37,180 Cette chaîne concaténée on lui a envoyé le message 98 00:04:37,380 --> 00:04:40,120 virgule avec ce paramètre-là et une autre chaîne a été 99 00:04:40,320 --> 00:04:41,500 créée, qui est le résultat final. 100 00:04:42,000 --> 00:04:43,910 Donc, on a une chaîne intermédiaire qu'on n'a pas vue, 101 00:04:44,170 --> 00:04:48,340 qui a été créée et qui fait perdre du temps en fait dans le temps de calcul. 102 00:04:48,950 --> 00:04:50,570 D'accord. Donc vous pouvez utiliser, vous avez eu la 103 00:04:50,770 --> 00:04:52,840 séquence sur le benchmarking, vous pouvez utiliser le 104 00:04:53,040 --> 00:04:56,940 benchmarking pour voir exactement ce qu'il en est, et s'il 105 00:04:57,140 --> 00:05:00,000 ne serait pas plus avantageux d'utiliser un string, d'accord. 106 00:05:00,200 --> 00:05:02,640 Donc ici, je créé une chaîne de caractères, d'accord et 107 00:05:02,840 --> 00:05:06,710 je dis que je vais lui définir un contenu à l'aide d'un stream, d'accord. 108 00:05:06,910 --> 00:05:09,510 Et je peux directement envoyer des chaînes de caractères 109 00:05:09,710 --> 00:05:11,170 dans ce string pour créer la chaîne finale. 110 00:05:11,560 --> 00:05:13,820 Donc, là j'évite le fait de créer des chaînes intermédiaires. 111 00:05:14,600 --> 00:05:15,670 Donc maintenant les symboles. 112 00:05:15,870 --> 00:05:18,080 Donc les symboles en fait syntaxiquement, vous vous 113 00:05:18,280 --> 00:05:20,640 souvenez, ils commencent par un dièse. 114 00:05:21,420 --> 00:05:23,180 Et puis ensuite il y a une chaîne de caractères. 115 00:05:23,380 --> 00:05:24,640 Donc ça c'est un symbole littéral. 116 00:05:25,320 --> 00:05:27,720 C'est une sorte de chaîne de caractères mais attention, 117 00:05:28,020 --> 00:05:29,760 elles sont uniques dans le système. 118 00:05:30,070 --> 00:05:32,560 C'est-à-dire que n'importe où dans mon programme si j'écris 119 00:05:32,760 --> 00:05:35,770 #blabla, et n'importe où dans le programme je réécris 120 00:05:36,000 --> 00:05:39,200 #blabla, c'est le même objet que je désigne d'accord, c'est 121 00:05:39,400 --> 00:05:43,170 la même instance. Donc, elles sont vraiment uniques dans le système. 122 00:05:43,370 --> 00:05:45,670 Donc ici, j'ai l'exemple avec Calvin, je fais #calvin == 123 00:05:45,870 --> 00:05:50,000 #calvin, donc ça me renvoie vrai, c'est bien le même objet. 124 00:05:50,400 --> 00:05:53,420 D'accord, ce n'est pas le cas pour les chaînes de caractères, ça dépend. 125 00:05:54,060 --> 00:05:56,110 Cela va dépendre des optimisations appliquées par le compilateur. 126 00:05:57,510 --> 00:06:00,440 Donc les symboles par rapport aux chaînes de caractères, 127 00:06:00,640 --> 00:06:01,640 la différence c'est vraiment ça. 128 00:06:01,840 --> 00:06:05,000 Un symbole c'est quelque chose qui va être uniquement en 129 00:06:05,200 --> 00:06:07,000 lecture, on ne peut pas modifier un symbole. 130 00:06:07,200 --> 00:06:08,200 On va créer un nouveau symbole. 131 00:06:08,610 --> 00:06:10,840 C'est un objet qui est unique, donc si je le référence 132 00:06:11,040 --> 00:06:12,860 plusieurs fois dans mon programme, je référence le même objet. 133 00:06:13,440 --> 00:06:15,250 Les chaînes de caractères elles sont mutales. 134 00:06:15,450 --> 00:06:17,160 Je peux modifier le contenu d'une chaîne de caractères. 135 00:06:17,740 --> 00:06:19,250 Il y a marqué "pour l'instant", puisque c'est en 136 00:06:19,450 --> 00:06:22,150 pourparlers de le changer ça dans Pharo dans dans le futur. 137 00:06:24,450 --> 00:06:29,150 Les symboles sont souvent utilisés pour désigner les 138 00:06:29,350 --> 00:06:30,230 sélecteurs de méthode. 139 00:06:30,430 --> 00:06:34,230 D'accord. Et les symboles sont extrêmement utilisés en 140 00:06:34,430 --> 00:06:37,840 tant que clé dans les dictionnaires et notamment les IdentityDictionnary. 141 00:06:38,040 --> 00:06:42,480 Vous vous souvenez qu'on va comparer les éléments 142 00:06:42,680 --> 00:06:46,230 et on va être capable de calculer facilement des hash à 143 00:06:46,430 --> 00:06:50,100 partir d'un symbole pour la clé dans un dictionnaire. 144 00:06:52,770 --> 00:06:54,900 Donc ce que vous devez retenir de cette séquence, ce qui 145 00:06:55,100 --> 00:06:57,070 est vraiment important c'est que les chaînes des 146 00:06:57,270 --> 00:07:00,660 caractères sont des collections comme les autres, et que 147 00:07:00,860 --> 00:07:04,490 les symboles sont des chaînes de caractères uniques et en lecture seule. 148 00:07:04,690 --> 00:07:06,080 Donc imutables, on ne peut pas les modifier.