2016-09-16 1 views
4

Je veux générer des combinaisons dans Pharo en utilisant l'extrait suivant:combinaisons: atATimeDo: comportement étrange dans Pharo 5.0

| col | 
col := Set new. 
(0 to: 7) asArray 
    combinations: 5 
    atATimeDo: [ : combination | col add: combination ]. 
^ col 

Je ne sais pas ce que je fais mal, mais toujours des résultats dans les répétitions du même collection:

"a Set(#(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7))" 

Quel pourrait être le problème?

Répondre

5

Je pense que c'est pour des raisons de performances, mais la façon dont #combinations:atATimeDo: est implémenté crée un seul tableau de la taille d'une combinaison et le remplit avec différents éléments et le passe au bloc. Ceci est plus efficace car vous n'allouez pas de nouveau tableau à chaque fois. D'un autre côté, ce qui se passe dans votre cas, c'est que vous ajoutez ce même objet à votre ensemble encore et encore, mais en même temps il change, de sorte que vous avez un ensemble avec le même objet qui a un état du dernière combinaison. Vous pouvez faire fonctionner votre code en stockant simplement un copy du tableau:

| col | 
col := Set new. 
(0 to: 7) asArray 
    combinations: 5 
    atATimeDo: [ : combination | col add: combination copy ]. 
^ col