Le Lundi 01 Mai 2006 00:49, Pascal Grossé a écrit :
Je ne pense pas que le code soit très "smalltalkien", mais c'est probablement mon premier programme de plus de 3 lignes dans ce langage, alors soyez indulgents.
Je ne vois rien à redire, tu maitrises déjà bien les blocs de code à plusieurs arguments et les collections !
Petite question en passant: je n'ai pas réussi à savoir s'il était raisonnable de modifier les valeurs d'un dictionnaire tout en le parcourant. Dans le doute, j'ai préféré m'abstenir.
Pascal
Tout à fait, cela est sûr tant que l'on ne modifie pas les clés du dictionnaire (ni ajout, ni retrait ni changement).
Pourquoi ? Les dictionnaires sont stockés comme une collection d'objets (clé -> valeurs) appelées Association. Quand on change la valeur, le même objet Association est conservé. Et l'ordre des entrées du dictionnaire aussi.
Voir aussi aDictionary associationsDo: [:assoc | assoc value: (...)]. Cette boucle est bien moins jolie que keysAndValuesDo: mais plus efficace (évite un accès at:put:).
Note qu'il y a des trous (nil) dans le Dictionary, de sorte que l'algorithme d'accès rapide par hash code soit efficace (cf implementors de hash et Dictionary>>findKeyOrNil:).
Le hash code de l'association qui permet de calculer l'indice où retrouver une clé est bien entendu calculé uniquement à partir de la clé.
C'est pourquoi il ne faut surtout pas modifier la clé par aDictionary associationsDo: [:assoc | assoc key: (...)] sinon tu ne retrouveras plus tes petits (clé rangée au mauvais endroit)
Nicolas