комбинации: ататимедо: странное поведение в Фаро 5.0


Я хочу генерировать комбинации в Pharo, используя следующий фрагмент кода:

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

Я не знаю, что я делаю неправильно, но всегда приводит к повторению одной и той же коллекции:

 "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))"

В чем может быть проблема?

1 4

1 ответ:

Я думаю, что это связано с соображениями производительности, но Способ #combinations:atATimeDo: реализуется так, что он создает единый массив размером с комбинацию и заполняет его различными элементами и передает его в блок. Это более эффективно, потому что вы не выделяете новый массив каждый раз. С другой стороны, в вашем случае происходит то, что вы на самом деле добавляете один и тот же объект в свой набор снова и снова, но в то же время он меняется, так что в результате вы получаете набор с тем же самым объект, имеющий состояние последней комбинации. Вы можете заставить ваш код работать, просто сохраняя copy массива:

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