комбинации: ататимедо: странное поведение в Фаро 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 ответ:
Я думаю, что это связано с соображениями производительности, но Способ
#combinations:atATimeDo:
реализуется так, что он создает единый массив размером с комбинацию и заполняет его различными элементами и передает его в блок. Это более эффективно, потому что вы не выделяете новый массив каждый раз. С другой стороны, в вашем случае происходит то, что вы на самом деле добавляете один и тот же объект в свой набор снова и снова, но в то же время он меняется, так что в результате вы получаете набор с тем же самым объект, имеющий состояние последней комбинации. Вы можете заставить ваш код работать, просто сохраняяcopy
массива:| col | col := Set new. (0 to: 7) asArray combinations: 5 atATimeDo: [ : combination | col add: combination copy ]. ^ col