2010-03-08 12 views
2

J'ai un dictionnaire d'objets que j'ai créé dans smalltalk, que je suis en train d'itérer en l'énumérant en fonction des paires clé/valeur.Renvoyer des messages dans Smalltalk

Pour l'objet valeur dans le dictionnaire, j'appelle une méthode sur cet objet. En fonction de certaines conditions, j'aimerais que cet objet puisse ajouter un nouveau membre au dictionnaire, et éventuellement en supprimer un autre. J'ai regardé les fonctions 'Perform' et 'Messages' dans Smalltalk, mais je ne suis pas sûr qu'il soit même possible de faire ce que j'essaie de faire - est-il possible de retourner un message (ou plusieurs messages) qu'un autre objet peut traiter et exécuter? Par exemple, ma méthode peut-elle retourner 'removeKey: 19' et 'ajouter un objet' en même temps? J'utilise GNU Smalltalk, si cela est important.

Répondre

5

Lorsque vous itérer sur la collection, passent la collection dans le cadre de l'argument:

aCollection copy do: [:each | each doSomethingOn: aCollection] 

La copie assure que le #doSomethingOn: peut modifier la collection originale sans gâcher l'itération.

1

Une méthode Smalltalk ne peut pas renvoyer plusieurs valeurs, mais il peut retourner une collection contenant ces valeurs:

foo 
^Array with: 1 with: 2. 

Vous retournez une collection avec plusieurs méthodes, et juste au-dessus itérer, l'envoi des messages la collection.

1

Le message de classe peut faire ce que vous voulez:

(Message selector: #raisedTo: argument: 2) sendTo: 3 

Ce produit "9" lors de l'évaluation. Notez que l'ajout ou la suppression d'éléments d'une collection lors d'une itération n'est généralement pas une bonne idée. Essayez d'abord de copier la collection, d'effectuer une itération sur la copie et de modifier l'original à partir du bloc utilisé pour parcourir la copie.

0

Comme vous itérer, ajoutez les éléments que vous souhaitez ajouter à aDictionary, à aTemporaryDictionaryOfAdds, et les éléments que vous souhaitez supprimer à aTemporaryDictionaryOfDeletes

itérer Puis, à travers chacun de ceux-ci, ajoutant et la suppression de aDictionary que vous faire.

Si vous ajoutez les suppressions à aDictionaryOfThingsDeletedFromADictionary, vous avez également un historique.