Как скопировать вложенные массивы и убедиться, что копия является полной копией оригинала - PullRequest
4 голосов
/ 12 марта 2011

Есть ли простой способ скопировать вложенный массив, чтобы каждый объект в массиве был «дуплом» оригинала?Недавно я столкнулся с этим:

irb(main):001:0> a = [[1,2],[3,4]]
=> [[1, 2], [3, 4]]
irb(main):002:0> b = a.dup
=> [[1, 2], [3, 4]]
irb(main):003:0> a[0][1] = 99
=> 99
irb(main):004:0> a
=> [[1, 99], [3, 4]]
irb(main):005:0> b
=> [[1, 99], [3, 4]]
irb(main):006:0> a[0] = [101,102]
=> [101, 102]
irb(main):007:0> a
=> [[101, 102], [3, 4]]
irb(main):008:0> b
=> [[1, 99], [3, 4]]

Так что, хотя первый уровень массивов в a был отдельными объектами, их содержимое не было, a[0][1] по-прежнему равно b[0][1].Общее решение даже не должно знать, насколько глубоко вложен массив.Прогулка по каждому предмету и превращение его в самоубийство звучит для меня немного грубо.

1 Ответ

3 голосов
/ 12 марта 2011
b = Marshal.load(Marshal.dump(a))
...