2015-04-14 2 views
0

Я совершенно новый для Руби. Я наткнулся на то, что не могу объяснить.Хранение массива в другой массив, получение неожиданного результата?

Вот мой код:

arr1 = [] 
arr2 = [0] 

5.times{ 
    arr2[0] += 1 
    arr1 << arr2 
    } 
puts "result = #{arr1}" 

Я ожидал следующий результат:

result = [[1],[2],[3],[4],[5]] 

Однако это результат я получаю:

result = [[5],[5],[5],[5],[5]] 
Может кто-то

объясните мне, почему это происходит? как я могу это исправить?

Большое спасибо,

+0

Попробуйте 'arr1 + = arr2'. Я думаю, что вы добавляете один и тот же 'arr2' пять раз, поэтому он обновляется, даже когда он находится в' arr1' –

ответ

2

Таким образом, вы не просто добавив значение arr1 в arr2. Вы фактически добавляете arr1 к arr2. Затем вы снова добавляете arr1 в arr2, теперь он имеет тот же массив в два раза.

Возможно, вы захотите добавить копию arr1 в arr2.

arr1 << arr2.dup 
+0

Да, я понимаю, что я делаю неправильно. Спасибо за ваш ответ – Shibl

0

Проблема, которую я вижу, заключается в том, что вы изменяете значение изменяемой структуры.

Вы держите мутирует arr2 и вставив тот же экземпляр в arr1

Если проследить через исполнение

arr2[0] +=1 # arr1 = [], arr2 = [1] 
arr1 << arr2 # arr1 = [[1]], arr2 = [1] 

arr2[0] +=1 # arr1 = [[2]],  arr2 = [2] 
arr1 << arr2 # arr1 = [[2],[2]], arr2 = [2] 

arr2[0] +=1 # arr1 = [[3],[3]],  arr2 = [3] 
arr1 << arr2 # arr1 = [[3],[3],[3]], arr2 = [3] 

... 

Вы можете проверить, что это тот же самый экземпляр вы вставляете делая это:

arr1.map(&:hash).uniq 
+0

Интересно, я раньше не рассматривал концепцию изменчивых/неизменных объектов. Теперь, когда я его прочитал, многие вещи имеют смысл – Shibl

Смежные вопросы