WEBVTT

00:00:00.660 --> 00:00:02.380 align:middle
Bonjour. Alors aujourd'hui
on va revenir sur quelque

00:00:02.580 --> 00:00:04.220 align:middle
chose que vous avez
déjà vu dans les séquences

00:00:04.420 --> 00:00:07.130 align:middle
précédentes, mais on va vraiment
réefoncer le clou dans cette séquence.

00:00:07.390 --> 00:00:10.040 align:middle
Donc les caractères, les
chaines de caractères et les symboles.

00:00:11.120 --> 00:00:14.180 align:middle
Ce que vous allez
apprendre, c'est vraiment comment on

00:00:14.380 --> 00:00:15.900 align:middle
manipule les caractères,
comment sont représentés les

00:00:16.100 --> 00:00:17.440 align:middle
chaines de caractères et
qu'est-ce que c'est un symbole

00:00:17.640 --> 00:00:18.610 align:middle
par rapport à une
chaîne de caractères.

00:00:19.680 --> 00:00:21.840 align:middle
Donc on revient à la
base, les caractères.

00:00:22.040 --> 00:00:24.100 align:middle
Donc les caractères en Pharo
sont représentés, vous vous

00:00:24.300 --> 00:00:25.850 align:middle
souvenez, on commence par
un dollar suivi d'une lettre.

00:00:28.930 --> 00:00:31.560 align:middle
Donc ça, c'est pour représenter
les caractères sous forme littérale.

00:00:32.030 --> 00:00:35.220 align:middle
D'accord. Et puis les
caractères qu'on ne peut pas

00:00:35.420 --> 00:00:37.250 align:middle
représenter, qui n'ont
pas de formes représentables

00:00:37.450 --> 00:00:40.370 align:middle
typiquement l'espace, le
tab, le cr return, donc ça c'est

00:00:40.570 --> 00:00:42.490 align:middle
le caractère qui
permet de passer à la ligne.

00:00:43.240 --> 00:00:45.480 align:middle
Donc en fait, on utilise la
 classe caractère auquel on va

00:00:45.680 --> 00:00:47.440 align:middle
envoyer un message pour
obtenir ce caractère-là.

00:00:50.100 --> 00:00:51.350 align:middle
Donc les chaînes de
caractères maintenant.

00:00:51.550 --> 00:00:53.430 align:middle
Les chaînes de caractères en
Pharo sont représentées donc

00:00:53.630 --> 00:00:56.570 align:middle
entre simples côtes. Donc
ici, c'est ce caractère-là.

00:00:57.150 --> 00:00:59.620 align:middle
Donc ici, on a eu une
chaîne de caractères éclair au

00:00:59.820 --> 00:01:02.480 align:middle
chocolat qui commence
ici et qui se termine ici.

00:01:02.790 --> 00:01:06.560 align:middle
On peut lui envoyer un
message Size, ça nous rend

00:01:07.700 --> 00:01:11.260 align:middle
18. Donc cette chaîne de
caractères contient bien 18 caractères.

00:01:12.330 --> 00:01:13.370 align:middle
On peut manipuler
cette chaîne de caractères.

00:01:13.840 --> 00:01:17.550 align:middle
Par exemple, je peux dire
caractère space split cette

00:01:17.750 --> 00:01:19.410 align:middle
chaîne de caractères-là.
Donc ça veut dire que je vais

00:01:19.610 --> 00:01:21.630 align:middle
découper cette chaîne
en fonction des espaces.

00:01:21.830 --> 00:01:24.890 align:middle
Et ça va me rendre une
collection ordonnée de 3 éléments.

00:01:25.270 --> 00:01:27.830 align:middle
Donc la chaîne a bien
été coupée en 3 éléments.

00:01:29.080 --> 00:01:31.180 align:middle
Alors, en fait les
chaînes de caractères sont des

00:01:31.380 --> 00:01:33.770 align:middle
collections comme
les autres en Pharo.

00:01:34.000 --> 00:01:37.820 align:middle
Donc c'est vraiment une
collection instance de la classe string.

00:01:38.020 --> 00:01:40.610 align:middle
Mais la classe string va
hériter des classes de collection.

00:01:41.690 --> 00:01:44.570 align:middle
Donc je peux utiliser
toutes les méthodes classiques.

00:01:44.770 --> 00:01:46.180 align:middle
Vous vous souvenez sur
les collections on a une API

00:01:46.380 --> 00:01:49.470 align:middle
commune qui existe pour
toutes les collections, donc par

00:01:49.670 --> 00:01:52.360 align:middle
exemple, at pour toutes
les collections indexées.

00:01:53.300 --> 00:01:56.290 align:middle
Donc si je fais éclair au
chocolat at 1, donc je veux l'élément

00:01:56.490 --> 00:01:58.720 align:middle
1 de cette collection, ça me
retourne bien le caractère E.

00:01:58.920 --> 00:02:01.210 align:middle
D'accord qui était bien ce E là.

00:02:02.750 --> 00:02:05.290 align:middle
Ensuite je peux utiliser do qui
permet de parcourir l'ensemble

00:02:05.490 --> 00:02:06.380 align:middle
des éléments d'une collection.

00:02:06.690 --> 00:02:09.020 align:middle
Et donc à chaque tour de
boucle, le paramètre du bloc ici

00:02:09.220 --> 00:02:11.870 align:middle
vaudra le premier élément
de la collection, le deuxième

00:02:12.070 --> 00:02:13.200 align:middle
et caetera, jusqu'au bout.

00:02:14.120 --> 00:02:17.480 align:middle
Donc petite subtilité, vu
que les chaines de caractères

00:02:17.910 --> 00:02:19.660 align:middle
sont définies par des simple côtes.

00:02:20.240 --> 00:02:21.780 align:middle
Donc si je veux mettre
des côtes dans une chaîne de

00:02:22.000 --> 00:02:23.920 align:middle
caractères l'astuce
c'est de les doubler.

00:02:24.120 --> 00:02:26.350 align:middle
Si j'en mets 2
côte-à-côte, ça veut dire que je veux

00:02:26.550 --> 00:02:29.060 align:middle
insérer une côte dans
ma chaîne de caractère.

00:02:29.510 --> 00:02:33.010 align:middle
D'accord. Par contre
attention, la subtilité c'est qu'elle

00:02:33.210 --> 00:02:35.650 align:middle
ne compte que pour un seul
élément dans la chaîne de caractères.

00:02:35.910 --> 00:02:38.170 align:middle
Donc ici vous avez
l'exemple, si je fais l'éclair au

00:02:38.370 --> 00:02:41.340 align:middle
chocolat at 2, d'accord.
Donc, je veux l'élément 2 de

00:02:41.540 --> 00:02:44.750 align:middle
cette collection, ça me
retourne bien le caractère côte.

00:02:45.240 --> 00:02:49.590 align:middle
Et si je demande at 3, ça
me retourne le E qui est ici.

00:02:49.790 --> 00:02:53.060 align:middle
D'accord. Donc même si on
affiche 2 côtes, ça prend

00:02:53.260 --> 00:02:54.050 align:middle
l'espace que pour une seule côte.

00:02:56.910 --> 00:02:59.630 align:middle
Donc les chaînes de caractères
sont des collections comme les autres.

00:02:59.830 --> 00:03:01.640 align:middle
Donc je peux les manipuler
comme des collections, je peux

00:03:01.840 --> 00:03:04.660 align:middle
dire que je veux par
exemple le dernier élément d'une

00:03:04.860 --> 00:03:08.710 align:middle
chaîne de caractères, donc
je fais str at str size, donc

00:03:09.250 --> 00:03:10.580 align:middle
je récupère le dernier élément.

00:03:10.780 --> 00:03:13.500 align:middle
Je vous rappelle en Pharo, les
collections commencent à l'indice

00:03:13.700 --> 00:03:18.000 align:middle
1, donc le dernier élément
c'est la taille de la chaîne.

00:03:18.180 --> 00:03:19.630 align:middle
Ou on peut utiliser la
méthode plus simple qui est last

00:03:19.830 --> 00:03:21.950 align:middle
pour récupérer directement le
dernier élément de la collection.

00:03:22.900 --> 00:03:25.110 align:middle
Donc pour créer des
chaînes, on a plusieurs techniques

00:03:25.310 --> 00:03:27.110 align:middle
pour créer des chaînes, on
a la technique simple, c'est

00:03:27.310 --> 00:03:29.850 align:middle
je prends un symbole et
j'utilise une méthode de conversion.

00:03:30.050 --> 00:03:32.600 align:middle
Donc je convertis ce symbole
en chaîne de caractères avec

00:03:32.800 --> 00:03:35.520 align:middle
asString, ou je peux envoyer
printString à n'importe quel

00:03:35.720 --> 00:03:39.100 align:middle
objet qui va permettre de
récupérer une représentation

00:03:39.300 --> 00:03:40.800 align:middle
sous-forme de chaîne de
caractères de l'objet.

00:03:42.550 --> 00:03:45.190 align:middle
Et puis, je peux créer
une méthode de création

00:03:45.390 --> 00:03:47.360 align:middle
directement d'une
collection, vous vous souvenez on peut

00:03:47.560 --> 00:03:50.880 align:middle
with à n'importe quelle
 classe de collection pour créer

00:03:51.080 --> 00:03:54.150 align:middle
une nouvelle collection,
contenant directement un certain

00:03:54.350 --> 00:03:56.000 align:middle
objet à l'intérieur. Donc,
si je fais string with le

00:03:56.200 --> 00:03:58.410 align:middle
caractère A, ça va me
retourner une chaîne de caractères

00:03:58.660 --> 00:04:00.240 align:middle
qui ne contient
qu'un seul caractère A.

00:04:00.910 --> 00:04:02.660 align:middle
Pour concaténer des
chaînes de caractères, on l'avait

00:04:02.860 --> 00:04:05.570 align:middle
déjà vu, c'est le message virgule.

00:04:05.920 --> 00:04:07.620 align:middle
Donc, je peux envoyer le
message virgule à une chaîne de

00:04:07.820 --> 00:04:09.300 align:middle
caractères et je passe en
paramètre une autre chaîne de

00:04:09.500 --> 00:04:11.180 align:middle
caractères, ça va m'en
construire une nouvelle qui est la

00:04:11.380 --> 00:04:13.670 align:middle
concaténation des 2,
bien sûr je peux chaîner.

00:04:14.670 --> 00:04:18.220 align:middle
Attention toutefois si je
fais ça, donc si je reprends le

00:04:18.420 --> 00:04:21.240 align:middle
même exemple, il faut bien
comprendre qu'ici j'ai créé

00:04:21.440 --> 00:04:23.020 align:middle
des chaînes intermédiaires inutiles.

00:04:23.720 --> 00:04:26.820 align:middle
Donc en fait, j'ai ce
premier message qui a été envoyé à

00:04:27.020 --> 00:04:30.950 align:middle
cette chaîne-là, avec ce
paramètre-là, donc on a une

00:04:31.150 --> 00:04:34.360 align:middle
première chaîne ici concaténée qui
a été créée, d'accord pour tout ça.

00:04:35.060 --> 00:04:37.180 align:middle
Cette chaîne concaténée
on lui a envoyé le message

00:04:37.380 --> 00:04:40.120 align:middle
virgule avec ce
paramètre-là et une autre chaîne a été

00:04:40.320 --> 00:04:41.500 align:middle
créée, qui est le résultat final.

00:04:42.000 --> 00:04:43.910 align:middle
Donc, on a une chaîne
intermédiaire qu'on n'a pas vue,

00:04:44.170 --> 00:04:48.340 align:middle
qui a été créée et qui fait perdre du
temps en fait dans le temps de calcul.

00:04:48.950 --> 00:04:50.570 align:middle
D'accord. Donc vous pouvez
utiliser, vous avez eu la

00:04:50.770 --> 00:04:52.840 align:middle
séquence sur le
benchmarking, vous pouvez utiliser le

00:04:53.040 --> 00:04:56.940 align:middle
benchmarking pour voir
exactement ce qu'il en est, et s'il

00:04:57.140 --> 00:05:00.000 align:middle
ne serait pas plus avantageux
d'utiliser un string, d'accord.

00:05:00.200 --> 00:05:02.640 align:middle
Donc ici, je créé une
chaîne de caractères, d'accord et

00:05:02.840 --> 00:05:06.710 align:middle
je dis que je vais lui définir un
contenu à l'aide d'un stream, d'accord.

00:05:06.910 --> 00:05:09.510 align:middle
Et je peux directement
envoyer des chaînes de caractères

00:05:09.710 --> 00:05:11.170 align:middle
dans ce string pour
créer la chaîne finale.

00:05:11.560 --> 00:05:13.820 align:middle
Donc, là j'évite le fait de
créer des chaînes intermédiaires.

00:05:14.600 --> 00:05:15.670 align:middle
Donc maintenant les symboles.

00:05:15.870 --> 00:05:18.080 align:middle
Donc les symboles en fait
syntaxiquement, vous vous

00:05:18.280 --> 00:05:20.640 align:middle
souvenez, ils
commencent par un dièse.

00:05:21.420 --> 00:05:23.180 align:middle
Et puis ensuite il y a
une chaîne de caractères.

00:05:23.380 --> 00:05:24.640 align:middle
Donc ça c'est un symbole littéral.

00:05:25.320 --> 00:05:27.720 align:middle
C'est une sorte de chaîne
de caractères mais attention,

00:05:28.020 --> 00:05:29.760 align:middle
elles sont uniques dans le système.

00:05:30.070 --> 00:05:32.560 align:middle
C'est-à-dire que n'importe où
dans mon programme si j'écris

00:05:32.760 --> 00:05:35.770 align:middle
#blabla, et n'importe où
dans le programme je réécris

00:05:36.000 --> 00:05:39.200 align:middle
#blabla, c'est le même objet
que je désigne d'accord, c'est

00:05:39.400 --> 00:05:43.170 align:middle
la même instance. Donc, elles sont
vraiment uniques dans le système.

00:05:43.370 --> 00:05:45.670 align:middle
Donc ici, j'ai l'exemple
avec Calvin, je fais #calvin ==

00:05:45.870 --> 00:05:50.000 align:middle
#calvin, donc ça me renvoie
vrai, c'est bien le même objet.

00:05:50.400 --> 00:05:53.420 align:middle
D'accord, ce n'est pas le cas pour
les chaînes de caractères, ça dépend.

00:05:54.060 --> 00:05:56.110 align:middle
Cela va dépendre des
optimisations appliquées par le compilateur.

00:05:57.510 --> 00:06:00.440 align:middle
Donc les symboles par
rapport aux chaînes de caractères,

00:06:00.640 --> 00:06:01.640 align:middle
la différence c'est vraiment ça.

00:06:01.840 --> 00:06:05.000 align:middle
Un symbole c'est quelque
chose qui va être uniquement en

00:06:05.200 --> 00:06:07.000 align:middle
lecture, on ne peut
pas modifier un symbole.

00:06:07.200 --> 00:06:08.200 align:middle
On va créer un nouveau symbole.

00:06:08.610 --> 00:06:10.840 align:middle
C'est un objet qui est
unique, donc si je le référence

00:06:11.040 --> 00:06:12.860 align:middle
plusieurs fois dans mon
 programme, je référence le même objet.

00:06:13.440 --> 00:06:15.250 align:middle
Les chaînes de
caractères elles sont mutales.

00:06:15.450 --> 00:06:17.160 align:middle
Je peux modifier le contenu
d'une chaîne de caractères.

00:06:17.740 --> 00:06:19.250 align:middle
Il y a marqué "pour
l'instant", puisque c'est en

00:06:19.450 --> 00:06:22.150 align:middle
pourparlers de le changer ça
dans Pharo dans dans le futur.

00:06:24.450 --> 00:06:29.150 align:middle
Les symboles sont souvent
utilisés pour désigner les

00:06:29.350 --> 00:06:30.230 align:middle
sélecteurs de méthode.

00:06:30.430 --> 00:06:34.230 align:middle
D'accord. Et les symboles
sont extrêmement utilisés en

00:06:34.430 --> 00:06:37.840 align:middle
tant que clé dans les dictionnaires
et notamment les IdentityDictionnary.

00:06:38.040 --> 00:06:42.480 align:middle
Vous vous souvenez qu'on
va comparer les éléments

00:06:42.680 --> 00:06:46.230 align:middle
et on va être capable de
calculer facilement des hash à

00:06:46.430 --> 00:06:50.100 align:middle
partir d'un symbole pour
la clé dans un dictionnaire.

00:06:52.770 --> 00:06:54.900 align:middle
Donc ce que vous devez
retenir de cette séquence, ce qui

00:06:55.100 --> 00:06:57.070 align:middle
est vraiment important
c'est que les chaînes des

00:06:57.270 --> 00:07:00.660 align:middle
caractères sont des
collections comme les autres, et que

00:07:00.860 --> 00:07:04.490 align:middle
les symboles sont des chaînes de
caractères uniques et en lecture seule.

00:07:04.690 --> 00:07:06.080 align:middle
Donc imutables, on ne
peut pas les modifier.

