1 00:00:01,080 --> 00:00:04,780 Alors dans cette séquence nous allons voir les éléments 2 00:00:05,000 --> 00:00:07,290 essentiels de la hiérarchie des collections en Pharo. 3 00:00:07,770 --> 00:00:09,910 Donc vous allez voir que Pharo est riche du point de vue 4 00:00:10,110 --> 00:00:14,070 des différents types de collections, mais il facilite la 5 00:00:14,270 --> 00:00:17,000 vie du programmeur puisqu'ils présentent tous une API commune. 6 00:00:17,720 --> 00:00:20,790 Et on verra également la différence entre les collections 7 00:00:21,030 --> 00:00:22,640 littérales et les collections dynamiques. 8 00:00:24,170 --> 00:00:26,360 Donc là l'API des collections, comme je disais, est 9 00:00:26,560 --> 00:00:28,550 riche, on verra qu'il y a beaucoup de types de collections différents. 10 00:00:29,000 --> 00:00:31,590 Toutes présentent une API commune, on le verra, qui est 11 00:00:31,790 --> 00:00:34,910 assez bien organisée, qui facilite énormément la vie du programmeur. 12 00:00:36,040 --> 00:00:39,000 Petit point particulier en Pharo les collections, les 13 00:00:39,200 --> 00:00:41,910 index des collections, commencent à 1 alors que ça 14 00:00:42,110 --> 00:00:43,500 commence à 0 dans d'autres langages. 15 00:00:44,330 --> 00:00:46,630 Et puis les collections peuvent contenir n'importe quel 16 00:00:46,830 --> 00:00:49,180 type d'objet en Pharo, ce qui n'est pas forcément le cas 17 00:00:49,380 --> 00:00:50,140 dans dans les autres langages. 18 00:00:51,700 --> 00:00:54,530 Donc quelques-unes des collections les plus remarquables 19 00:00:54,730 --> 00:00:56,810 et les plus utilisées, donc OrderedCollection qui est une 20 00:00:57,010 --> 00:01:00,580 collection dynamique dont la taille va grossir à chaque 21 00:01:00,780 --> 00:01:02,230 fois qu'on ajoute des éléments dedans. 22 00:01:02,530 --> 00:01:05,410 Array qui est une collection de taille fixe. 23 00:01:05,880 --> 00:01:07,820 Et puis on va accéder aux éléments en fonction d'un 24 00:01:08,020 --> 00:01:12,910 indice Set, qui va contenir des éléments mais sans doublon. 25 00:01:13,450 --> 00:01:16,000 On ne pourra pas insérer 2 fois le même élément dans un Set. 26 00:01:16,330 --> 00:01:18,520 Et puis les dictionnaires, donc les dictionnaires ce sont 27 00:01:18,720 --> 00:01:21,040 des tables de hachage, à une clé donnée j'associe une valeur. 28 00:01:22,160 --> 00:01:24,340 Donc vous avez ici un extrait de la hiérarchie des 29 00:01:24,540 --> 00:01:25,770 collections, c'est seulement un extrait. 30 00:01:26,000 --> 00:01:28,080 Il est plus riche que ça en Pharo. 31 00:01:28,280 --> 00:01:29,580 Donc voyez qu'il y a plein de classes. 32 00:01:29,780 --> 00:01:32,010 Elles héritent toutes de collections, ce qui nous fournit 33 00:01:32,210 --> 00:01:33,680 une API commune pour l'ensemble des collections. 34 00:01:34,800 --> 00:01:36,910 Et puis on va voir celles qui sont en gras, on voit les 35 00:01:37,110 --> 00:01:39,260 expliciter un peu au fur et à mesure de cette séquence. 36 00:01:40,690 --> 00:01:44,270 Donc il existe une API commune, je vous disais, répartie en 7 points. 37 00:01:44,540 --> 00:01:46,550 On a des méthodes spécifiques pour la création des 38 00:01:46,750 --> 00:01:49,270 collections, qu'on va envoyer plutôt aux classes des collections. 39 00:01:49,530 --> 00:01:51,530 Des méthodes spécifiques pour accéder aux propriétés des 40 00:01:51,730 --> 00:01:53,900 collections, que ce soit accéder par exemple à la taille 41 00:01:54,330 --> 00:01:57,540 d'une collection ou accéder même aux éléments que la collection contient. 42 00:01:58,150 --> 00:02:01,000 Des méthodes de tests, savoir est-ce que la collection est vide ou pas. 43 00:02:01,240 --> 00:02:03,020 Des méthodes d'ajout et de retrait d'éléments, des 44 00:02:03,220 --> 00:02:05,130 méthodes d'énumération des éléments dans une collection. 45 00:02:05,420 --> 00:02:07,190 Donc je parcours l'ensemble des éléments, je voudrais 46 00:02:08,190 --> 00:02:11,080 savoir si un élément existe, est présent dans une collection ou pas. 47 00:02:11,580 --> 00:02:14,410 Et puis on a des méthodes de conversion d'un type de 48 00:02:14,610 --> 00:02:15,500 collection en un autre type. 49 00:02:17,130 --> 00:02:18,200 Commençons par un exemple. 50 00:02:18,630 --> 00:02:21,600 Donc je veux créer une collection en Pharo tout bêtement. 51 00:02:21,800 --> 00:02:24,450 Je vais sélectionner la bonne classe qui m'intéresse et 52 00:02:24,650 --> 00:02:26,510 lui envoyer un message new pour instancier, pour créer un 53 00:02:26,710 --> 00:02:27,900 nouvel instance sur cette classe. 54 00:02:28,350 --> 00:02:30,240 Donc premier cas de figure, j'utilise new. 55 00:02:30,630 --> 00:02:31,600 Deuxième cas de figure. 56 00:02:32,070 --> 00:02:34,260 En fait je ne peux pas faire un new directement où j'ai 57 00:02:34,460 --> 00:02:36,020 envie de spécifier la taille de la collection. 58 00:02:36,430 --> 00:02:39,380 Donc typiquement Array je peux lui envoyer new:4, donc je 59 00:02:39,580 --> 00:02:41,490 fais un tableau de taille 4 ou un tableau de taille 2, 60 00:02:41,770 --> 00:02:43,280 donc ça marche également sur les OrderedCollection je 61 00:02:43,480 --> 00:02:48,000 pourrais faire un OrderedCollection. Donc on a d'autres 62 00:02:48,200 --> 00:02:50,440 types de méthodes pour créer des collections 63 00:02:50,930 --> 00:02:53,850 pré-initialisées, donc avec withAll par exemple où je 64 00:02:54,050 --> 00:02:55,160 vais passer une collection littérale. 65 00:02:55,500 --> 00:02:58,280 Une collection littérale ça commence par un #( je vous rappelle. 66 00:02:59,050 --> 00:03:01,300 Et puis ça va me créer donc une nouvelle instance de la 67 00:03:01,500 --> 00:03:03,080 classe OrderedCollection, donc un nouvel 68 00:03:03,280 --> 00:03:05,000 OrderedCollection qui contiendra bien tous les éléments 69 00:03:05,200 --> 00:03:06,870 qui ont été placés au moment de sa création. 70 00:03:07,630 --> 00:03:10,000 Je peux faire la même chose avec un Set, par contre je 71 00:03:10,200 --> 00:03:12,810 vous rappelle hein dans un Set on ne peut pas avoir d'objets doublons. 72 00:03:13,030 --> 00:03:15,750 Donc le chiffre 7 qu'on avait mis 2 fois dans la 73 00:03:15,950 --> 00:03:18,700 collection littérale il ne peut pas se retrouver 2 fois dans le Set. 74 00:03:21,300 --> 00:03:25,070 Donc il y a d'autres types, d'autres sortes de messages 75 00:03:25,270 --> 00:03:27,860 qu'on peut envoyer aux classes collection pour les initialiser. 76 00:03:28,140 --> 00:03:29,390 Ici j'en ai un autre exemple. 77 00:03:29,590 --> 00:03:33,020 new withAll, donc qui est un message, je veux faire une 78 00:03:33,220 --> 00:03:35,390 collection de taille 5 mais je veux que toutes les 79 00:03:35,590 --> 00:03:37,100 classes soient initialisées avec un certain objet. 80 00:03:37,370 --> 00:03:39,450 Donc en l'occurrence ici une Stream qui contient. 81 00:03:42,470 --> 00:03:46,230 Donc subtilité en Pharo toutes les collections commencent à l'indice 1. 82 00:03:46,680 --> 00:03:49,780 Donc si je demande à cette collection de 3 éléments de me 83 00:03:50,000 --> 00:03:52,470 rendre l'élément à l'indice 2, c'est bien'hates'. 84 00:03:52,670 --> 00:03:53,430 Donc c'est bien celui-là. 85 00:03:53,780 --> 00:03:55,920 Ça c'est 1, ça c'est 2, ça c'est 3. 86 00:03:57,260 --> 00:03:58,650 Donc c'est la même chose pour les OrderedCollection, si 87 00:03:58,850 --> 00:04:01,400 je convertis cette collection en OrderedCollection et je 88 00:04:01,600 --> 00:04:04,210 lui demande son élément indice 2, ça me revient'hates'la même chose. 89 00:04:05,950 --> 00:04:08,890 Donc les collections peuvent contenir toutes sortes d'objets, 90 00:04:09,090 --> 00:04:12,380 comme je l'ai dit, et ici je vous en montre un exemple 91 00:04:12,580 --> 00:04:15,190 cette collection littérale va contenir, dans son premier 92 00:04:15,390 --> 00:04:17,770 élément, la chaîne des caractères'calvin', et dans son 93 00:04:18,000 --> 00:04:21,460 second élément une collection qui contiendra les nombres 1, 2, 3. 94 00:04:22,150 --> 00:04:25,360 Je peux créer par exemple un tableau, donc ici ce tableau 95 00:04:25,560 --> 00:04:30,000 il est composé des éléments 1, 2 ici 96 00:04:31,060 --> 00:04:32,490 et d'un Set à la fin. 97 00:04:33,280 --> 00:04:36,960 Donc l'élément 1 a été ajouté ici, l'élément 2 ici et le Set ici. 98 00:04:38,240 --> 00:04:40,180 Donc on peut maintenant parcourir les éléments d'une 99 00:04:40,380 --> 00:04:43,810 collection, en utilisant le message "do" par exemple. 100 00:04:44,730 --> 00:04:49,000 Donc ici j'ai une collection et je vais lui envoyer le message "do". 101 00:04:49,690 --> 00:04:52,910 Je vais lui passer un block, donc je vous rappelle le 102 00:04:53,110 --> 00:04:55,380 block ici il commence avec le crochet ouvrant, il se 103 00:04:55,580 --> 00:04:59,040 ferme avec le crochet fermant. Le paramètre du block il s'appelle 104 00:04:59,240 --> 00:05:00,550 "each", donc qui commence par un :. 105 00:05:00,920 --> 00:05:03,850 Il est séparé du corps de block par la barre verticale et 106 00:05:04,050 --> 00:05:06,410 on va à chaque tour de boucles, "each" vaudra le premier 107 00:05:06,610 --> 00:05:08,550 élément de la collection, le deuxième et caetera jusqu'à la fin. 108 00:05:08,920 --> 00:05:12,180 Donc on va bien afficher sur le Transcript Calvin hates Suzie. 109 00:05:14,640 --> 00:05:15,400 Donc on a les tableaux. 110 00:05:16,110 --> 00:05:18,190 Donc les tableaux c'est des collections de taille fixe. 111 00:05:18,410 --> 00:05:21,820 Donc on peut demander à un tableau sa taille, j'y envoie le message "size". 112 00:05:22,580 --> 00:05:25,160 On peut accéder directement à un élément d'un tableau en 113 00:05:25,360 --> 00:05:28,050 lui envoyant le message "at:", je veux l'élément 2 de la collection. 114 00:05:28,250 --> 00:05:31,080 On peut modifier l'élément à l'indice 2 dans la 115 00:05:31,280 --> 00:05:35,030 collection en envoyant at:1 put'Calvin'. 116 00:05:35,730 --> 00:05:38,240 Donc je vais insérer la chaîne Calvin dans la case 1. 117 00:05:39,360 --> 00:05:40,630 Et puis je peux demander la taille. 118 00:05:40,830 --> 00:05:45,040 L'élément intéressant ici dans cet exemple c'est qu'on 119 00:05:45,240 --> 00:05:47,430 voit qu'on a construit le même tableau de 2 manières 120 00:05:47,630 --> 00:05:50,580 différentes: une première version littérale et une 121 00:05:50,780 --> 00:05:52,860 deuxième version dynamique ici, où j'ai vraiment 122 00:05:53,060 --> 00:05:57,730 instancié la classe Array à la main et rempli chacune des cases. 123 00:05:59,590 --> 00:06:02,250 Donc on peut envoyer le message "size" à une collection 124 00:06:02,450 --> 00:06:05,240 pour récupérer sa taille. On peut accéder à un élément d'une 125 00:06:05,440 --> 00:06:07,400 collection en lui fournissant la méthode "at:". 126 00:06:07,800 --> 00:06:08,830 Donc ça j'en ai déjà parlé. 127 00:06:10,590 --> 00:06:12,610 Donc il faut faire attention il y a une subtilité. 128 00:06:12,810 --> 00:06:14,760 Quand j'accède à un élément d'une collection en 129 00:06:14,960 --> 00:06:17,190 fournissant un indice, il faut faire attention que cet 130 00:06:17,390 --> 00:06:21,660 indice soit bien dans les bornes acceptées par la 131 00:06:21,860 --> 00:06:23,700 collection, qu'il soit inférieur à la taille de la collection. 132 00:06:24,030 --> 00:06:26,950 Si je demande à cette collection l'élément à l'indice 55 133 00:06:27,150 --> 00:06:28,790 forcément il n'existe pas puisque cette collection a une 134 00:06:29,000 --> 00:06:30,330 taille 3, donc ça va bien me rendre une erreur. 135 00:06:33,500 --> 00:06:36,020 Donc pour modifier les éléments, j'en ai parlé, à l'indice 136 00:06:36,220 --> 00:06:39,820 2 je veux modifier, insérer un nouvel élément dans la 137 00:06:40,020 --> 00:06:41,310 collection, la chaine des caractères'loves'. 138 00:06:41,620 --> 00:06:44,890 Donc ça bien remplacer'hates'par'loves', on le voit bien 139 00:06:45,530 --> 00:06:49,730 ici dans le résultat. 140 00:06:49,950 --> 00:06:54,590 Donc les tableaux littéraux, donc on a ici un exemple de 141 00:06:54,790 --> 00:06:57,770 tableau littéral, ça commence par #( comme je vous l'avais 142 00:06:58,000 --> 00:07:00,330 dit, on peut mettre n'importe quoi dedans donc un nom ou 143 00:07:00,530 --> 00:07:01,540 une chaine de caractères et cetera. 144 00:07:02,280 --> 00:07:05,680 Et puis tous les tableaux littéraux en Pharo sont 145 00:07:05,880 --> 00:07:07,350 instance de la classe Array par défaut. 146 00:07:08,100 --> 00:07:10,470 Donc je peux envoyer le message "class" à un tableau 147 00:07:10,670 --> 00:07:12,290 littéral et ça me rend bien Array. 148 00:07:12,490 --> 00:07:14,590 Donc c'est bien une instance de la classe Array. 149 00:07:18,850 --> 00:07:21,000 Alors les versions dynamiques et les versions littérales 150 00:07:21,200 --> 00:07:22,760 sont exactement équivalentes en Pharo. 151 00:07:22,960 --> 00:07:26,000 C'est juste une version plus concise, donc ça permet d'écrire ça plus vite. 152 00:07:26,630 --> 00:07:30,020 Donc ici vous avez la version littérale d'une collection 153 00:07:30,220 --> 00:07:32,510 et vous avez sa version dynamique où j'instancie vraiment 154 00:07:32,710 --> 00:07:33,470 la classe Array à la main. 155 00:07:33,830 --> 00:07:35,440 Mais c'est complètement équivalent puisque vous voyez 156 00:07:35,640 --> 00:07:36,830 bien que les 2 résultats sont les mêmes. 157 00:07:40,080 --> 00:07:43,100 Donc la classe OrderedCollection définit une collection 158 00:07:43,300 --> 00:07:46,570 particulière, qui est extensible, donc à chaque fois qu'on 159 00:07:46,770 --> 00:07:48,550 va ajouter des éléments elle va s'agrandir. 160 00:07:49,290 --> 00:07:53,460 Donc ici j'instancie la classe OrderedCollection en envoyant un message new. 161 00:07:53,660 --> 00:07:55,670 J'utilise la méthode "add" pour ajouter différents 162 00:07:55,870 --> 00:07:58,510 éléments dans cette collection. J'ai même des variations 163 00:07:58,710 --> 00:08:00,870 je peux faire "addFirst" pour ajouter un élément au début 164 00:08:01,070 --> 00:08:02,610 de la collection, par défaut il s'ajoute à la fin. 165 00:08:04,510 --> 00:08:07,890 Donc vous voyez à chaque fois ce que nous rend la collection. 166 00:08:08,090 --> 00:08:11,450 Donc là on a bien 3 éléments dans la collection: Pharo, Reef et Pharo. 167 00:08:11,720 --> 00:08:14,660 Si je fais "add: Seaside", "Seaside" est bien ajouté à la 168 00:08:14,860 --> 00:08:15,620 fin de la collection. 169 00:08:18,180 --> 00:08:21,300 J'ai des méthodes de conversion entre un type de collection et un autre. 170 00:08:21,650 --> 00:08:24,840 Donc par exemple ici j'utilise une collection littérale, 171 00:08:25,040 --> 00:08:27,070 donc qui va être un Array et le message 172 00:08:27,270 --> 00:08:31,250 asOrderedCollection qui va transformer ce tableau en 173 00:08:31,710 --> 00:08:32,470 collection ordonnée. 174 00:08:33,750 --> 00:08:37,020 Enfin les Set. Donc les Set sont un type de collection sans doublon. 175 00:08:37,450 --> 00:08:39,670 Donc pareil de taille extensible, donc à chaque fois que 176 00:08:39,870 --> 00:08:41,490 va ajouter un élément ça va grandir. 177 00:08:41,840 --> 00:08:44,800 Je peux utiliser une collection littérale que je 178 00:08:45,000 --> 00:08:48,000 transforme en Set et ça me donne bien un Set dans lequel 179 00:08:48,200 --> 00:08:49,000 les doublons ont été retirés. 180 00:08:50,440 --> 00:08:52,140 Ou alors je peux accéder à la version dynamique plutôt qu'une 181 00:08:52,340 --> 00:08:56,220 collection littérale. Set with with qui permet de créer 182 00:08:56,420 --> 00:08:59,090 un Set et de le remplir avec 2 éléments, deux Set à chaque fois. 183 00:09:02,210 --> 00:09:03,800 Donc les méthodes de conversion sont extrêmement 184 00:09:04,000 --> 00:09:06,760 pratiques pour jongler, pour transformer une collection en un autre type. 185 00:09:07,000 --> 00:09:09,880 Elles ont toujours la même forme c'est "as" + le nom de 186 00:09:10,080 --> 00:09:11,250 la collection qu'on voudra avoir. 187 00:09:14,080 --> 00:09:16,610 Les dictionnaires. Donc c'est un type de collection clés, valeurs. 188 00:09:16,810 --> 00:09:19,020 À une clé donnée j'associe une valeur. 189 00:09:19,390 --> 00:09:21,180 Elles sont aussi extensibles à chaque fois qu'on va 190 00:09:21,380 --> 00:09:23,640 ajouter des éléments elles vont grandir, et puis on a une 191 00:09:23,840 --> 00:09:28,400 API un peu particulière sur cette collection, 192 00:09:28,690 --> 00:09:31,820 donc le message "at" qui lui est classique, at:ifAbsent: 193 00:09:32,320 --> 00:09:34,440 c'est-à-dire si je veux accéder à un élément, à une clé 194 00:09:34,640 --> 00:09:37,890 particulière mais qu'elle n'existe pas, qu'est-ce que je dois rendre? 195 00:09:38,090 --> 00:09:40,840 "at: put: donc à une clé particulière je veux insérer une 196 00:09:41,040 --> 00:09:42,930 nouvelle valeur et caetera. Et puis je vais pouvoir 197 00:09:43,130 --> 00:09:46,890 itérer avec des messages tout à fait classiques "do", on 198 00:09:47,090 --> 00:09:49,080 a déjà vu, mais on va avoir des nouveaux messages 199 00:09:49,280 --> 00:09:52,650 "KeysDo" donc je parcours toutes les clés du dictionnaire 200 00:09:53,000 --> 00:09:54,060 ou les clés et les valeurs. 201 00:09:54,520 --> 00:09:55,520 Donc je vous donne un exemple. 202 00:09:55,720 --> 00:09:59,060 Ici j'ai créé l'instance de la classe dictionnaire, et 203 00:09:59,260 --> 00:10:02,110 puis dans ce dictionnaire, donc il faut voir un 204 00:10:02,310 --> 00:10:05,590 dictionnaire un peu comme un tableau, à la clé janvier j'associe 205 00:10:05,790 --> 00:10:09,820 le nombre 31, à la clé février le nombre 28 et à la clé mars le nombre 31. 206 00:10:13,020 --> 00:10:16,320 Donc c'est complètement équivalent à une collection dynamique. 207 00:10:16,520 --> 00:10:21,060 Donc une collection dynamique cette fois c'est créé avec une accolade. 208 00:10:21,260 --> 00:10:22,860 Accolade ouvrante, accolade fermante. 209 00:10:23,840 --> 00:10:26,390 Ici je vous rappelle la flèche c'est pour créer des associations. 210 00:10:27,060 --> 00:10:28,900 Donc ici j'ai un symbole. 211 00:10:29,290 --> 00:10:33,000 Donc au symbole janvier j'associe le nombre 31, donc ici 212 00:10:33,700 --> 00:10:36,610 j'ai bien une collection d'associations que je transforme 213 00:10:36,810 --> 00:10:38,150 en dictionnaire avec à le "Ad dictionary". 214 00:10:38,620 --> 00:10:42,760 Donc ces 2 formes pour créer le dictionnaire sont complètement équivalentes. 215 00:10:45,680 --> 00:10:47,830 Donc si je demande à une association, si je lui demande 216 00:10:48,030 --> 00:10:50,640 sa clé ça va bien nous renvoyer la clé, donc le début. 217 00:10:50,840 --> 00:10:52,380 On voit qu'ici c'est l'équivalent. 218 00:10:52,700 --> 00:10:54,640 Et puis si je demande à une association de me retourner 219 00:10:54,840 --> 00:10:56,160 sa valeur ça ne me retourne que la valeur. 220 00:10:56,510 --> 00:10:58,410 Donc ça c'est une paire ou une association. 221 00:11:00,670 --> 00:11:01,620 Donc les dictionnaires. 222 00:11:02,000 --> 00:11:05,630 Si je veux dans un dictionnaire accéder à une valeur 223 00:11:05,830 --> 00:11:09,420 particulière, il suffit que j'utilise "at" et la clé, je 224 00:11:09,620 --> 00:11:11,240 spécifie la clé pour laquelle je veux la valeur. 225 00:11:11,880 --> 00:11:15,250 Si c'est une clé qui est inexistante forcément je vais 226 00:11:15,560 --> 00:11:16,660 récupérer une erreur en retour. 227 00:11:18,720 --> 00:11:21,310 Et si je veux éviter ça ce que je peux faire c'est 228 00:11:21,510 --> 00:11:25,640 utiliser "at: ifAbsent", donc je fais "at" une clé qui n'existe 229 00:11:25,840 --> 00:11:28,010 pas dans le dictionnaire, et si c'est absent donc je vais 230 00:11:28,210 --> 00:11:30,590 récupérer la valeur qui est ici le 0. 231 00:11:31,760 --> 00:11:33,020 Donc on voit bien cette clé n'existe pas dans le 232 00:11:33,220 --> 00:11:34,000 dictionnaire donc je récupère la valeur 0. 233 00:11:35,320 --> 00:11:37,730 Je peux itérer sur un dictionnaire, donc si je fais un 234 00:11:37,930 --> 00:11:41,400 "do" sur les éléments d'un dictionnaire je récupère en 235 00:11:41,600 --> 00:11:44,040 fait ici que les valeurs du dictionnaire. 236 00:11:44,280 --> 00:11:45,040 On ne voit pas les clés. 237 00:11:45,460 --> 00:11:46,950 Alors pourquoi on peut se demander ça? 238 00:11:47,150 --> 00:11:48,950 C'est un peu bizarre de ne récupérer que les valeurs. 239 00:11:49,150 --> 00:11:51,740 En fait c'est complètement logique puisque si on regarde 240 00:11:51,940 --> 00:11:53,460 dans la classe "dictionnaire" l'implémentation de la 241 00:11:53,660 --> 00:11:57,170 méthode "do", qui prend un block, en fait elle fait à l'intérieur 242 00:11:57,370 --> 00:12:00,930 selfvaluesDo. Donc par défaut quand en fait un "do" sur 243 00:12:01,130 --> 00:12:03,570 un dictionnaire, on ne parcourt que ses valeurs et pas les clés. 244 00:12:05,520 --> 00:12:08,060 Si je veux parcourir les 2 en fait j'ai une méthode 245 00:12:08,260 --> 00:12:11,260 particulière qui s'appelle "KeysAndValuesDo", qui prend 246 00:12:11,460 --> 00:12:14,720 en paramètre un block avec 2 arguments: k et v. 247 00:12:15,340 --> 00:12:18,510 Et donc k ça correspondra bien à une clé et v à la valeur. 248 00:12:19,350 --> 00:12:22,000 Donc cette fois j'ai bien mon dictionnaire complet. 249 00:12:24,000 --> 00:12:27,090 Donc en résumé dans cette séquence on a vu que Pharo 250 00:12:27,370 --> 00:12:30,170 propose énormément de types de collections différents. 251 00:12:31,290 --> 00:12:33,300 Que toutes les collections proposent un vocabulaire 252 00:12:33,500 --> 00:12:36,000 commun, que ce soit pour créer des collections, pour 253 00:12:36,200 --> 00:12:38,610 accéder aux éléments, pour accéder à la taille d'une collection et caetera. 254 00:12:39,000 --> 00:12:40,350 Donc ça, ça facilite la vie du programmeur. 255 00:12:41,290 --> 00:12:44,370 Et c'est simple aussi de convertir un type de collection en un autre type. 256 00:12:44,950 --> 00:12:46,840 Et vous on a même vu quelque chose de supplémentaire, on 257 00:12:47,040 --> 00:12:49,080 a vu que quand on se pose des questions il est facile d'aller 258 00:12:49,280 --> 00:12:51,760 découvrir dans le système, dans Pharo, en allant lire le 259 00:12:52,000 --> 00:12:54,280 code des classes, en allant découvrir de nouvelles classes de collections.