2016-06-16 5 views
0

У меня возникла путаница в заполнении нового массива существующим массивом. Похоже, если я установил один массив равным другому, они станут динамически связаны для остальной части кода. Является ли это атрибутом компилятора или я не использую правильные функции для хранения значений одного массива в другом? Надеюсь, это не очень простой вопрос.Ruby: Динамически связанные массивы

main_arr = [1, 2, 3, 4, 5] 
temp_arr = main_arr 
puts "Main: " + main_arr.to_s 
puts "Temp: " + temp_arr.to_s 

main_arr.clear 
puts "Main: " + main_arr.to_s 
puts "Temp: " + temp_arr.to_s 

Выход:

Main: [1, 2, 3, 4, 5] 
Temp: [1, 2, 3, 4, 5] 
Main: [] 
Temp: [] 
+0

Если 'a' ваш массив,' a.dup' создаст "неглубокий" копию , Предположим, например, 'a = [[1,2], [3,4]]'. Затем 'b = a.dup # => [[1, 2], [3, 4]]'. Все идет нормально. Теперь добавим элемент в 'b':' b << 'dog' #=> [[1, 2], [3, 4], «собака»] '. 'a' не изменяется:' a # => [[1,2], [3,4]] '. Рассмотрим 'b [1] [0] # => 3'. Теперь давайте изменим этот элемент 'b' и посмотрим, что произойдет с' a': 'b [1] [0] = 'cat'; b # => [[1, 2], ["cat", 4], "dog"]; a # => [[1, 2], ["cat", 4]] '. Не то, что вы ожидали? Это потому, что 'dup' создает« мелкую »копию' a'. –

ответ

1

Это правда, в вашей второй линии вы делаете temp_array точку на объект массива, на который указывает main_arr. Если вы хотите, чтобы сделать копию этого массива вы можете сделать

b = a.dup 
+0

А отлично! Странно, что это не описано в документации Ruby для массивов ... –

+0

Это потому, что '# dup' находится в' Object': http://ruby-doc.org/core-2.3.1/Object.html# method-i-dup – jmschles

+0

Вы можете найти владельца метода экземпляра, например: 'Array.instance_method (: dup) .owner # => Kernel', или' [] .method (: dup) .owner # => Kernel '. (На самом деле, 'Array.instance_method (: dup) # => # ' достаточно, поскольку владелец показан в скобках.) Методы экземпляра ядра описаны в [Object ] (http://ruby-doc.org/core-2.2.0/Object.html) (см. второй абзац), что может немного запутать. (Методы модуля 'Kernel' задокументированы в [Kernel] (http://ruby-doc.org/core-2.2.0/Kernel.html).) –

0

когда вы делаете это: temp_arr = main_arr это означает, что temp_arr указывает на main_arr адрес. используйте вместо этого temp_arr = main_arr.dup.

main_arr = [1, 2, 3, 4, 5] 
temp_arr = main_arr **means** temp_arr -> [1, 2, 3, 4, 5] 

так, когда вы делаете это main_arr.clear -> [], а также temp_arr -> []

0

Попробуйте сделать:

main_arr = [1,2,3,4,5] 
temp_arr = main_arr.dup 

main_arr.clear 
puts main_arr # => [] 
puts temp_arr # => [1,2,3,4,5] 
Смежные вопросы