объекты и клоны в Ruby

при создании функции combos, я бы хотел получить результат разложения числа 4 (например) на слагаемые:

[[1, 1, 1, 1], [2, 1, 1], [2, 2], [3, 1], [4]]

но я получаю:

[[2, 1, 1, 0], [2, 2, 0], [3, 1], [4, 0], [4]]

проблема решается, если res << partition заменить на res << partition.dup

мой код

def solve part
  return nil if part.size == 1
  min_index = part.index(part[0...-1].min)
  part[min_index] += 1
  part[-1] -= 1
  part[0..min_index] + [1] * part[min_index + 1..-1].sum
end

def combos(n)
  res = []
  partition = [1] * n
  loop do
    break if partition.nil?
    res << partition
    partition = solve partition
  end
  res
end

хотелось бы узнать зачем надо добавлять копию объекта


Ответы (1 шт):

Автор решения: Василиса

Всё просто: в solve вы мутируете тот же самый partition, который только что положили в результирующий массив.

→ Ссылка