2015-12-28 3 views
1

У меня есть массив и целое число:Как отделить дублированные массивы?

ary = [2, 5, 4] 
num = 6 

Если я определить новый массив называется this, который является таким же, как ary:

this = ary 

Я добавил число в this:

this << num 

Когда я проверяю массивы, они оба одинаковы:

p this 
#=>[2, 5, 4, 6] 
p ary 
#=>[2, 5, 4, 6] 

Я только хочу, чтобы добавить номер this, в то время как ary все равно должны быть:

ary = [2, 5, 4] 

Почему это происходит и как я могу предотвратить ary от также имеющий номер, добавляемый к нему?

ответ

2

Оба ary и this являются ссылками на один и тот же экземпляр массива, побочный эффект от манипуляции будет отображаться при обращении к массиву с использованием другой переменной.

Если вы не хотите никаких побочных эффектов, используйте ary.dup для дублирования массива.

+0

Благодаря Сработало –

2

Вы фактически не создали новый массив. Вы просто сделали вторую переменную, относящуюся к одному и тому же массиву.

Чтобы создать новый массив, вы можете использовать dup:

array2 = array.dup 
0

Это то, что происходит:

ary = [] 
ary.object_id # => 70207239648660 

object_id возвращает идентификатор для объекта, в данном случае это ID Руби для ary , Это значение будет меняться каждый раз, когда код будет запущен, поэтому не ожидайте, что он будет соответствовать моему.

new_ary = ary 
new_ary.object_id # => 70207239648660 

Вы можете видеть, что рубин говорит new_ary и ary являются тем же объектом.

ary << 1 
ary # => [1] 
new_ary # => [1] 

Если мы изменим ary, как это и new_ary изменяются в результате.

new_ary << 2 
ary # => [1, 2] 
new_ary # => [1, 2] 

И наоборот.

new_ary = ary.dup 
new_ary.object_id # => 70207239645700 

Если мы используем dup Ruby, копируют содержимое в другие переменные пространства и возвращаем его.

new_ary << 3 
ary # => [1, 2] 
new_ary # => [1, 2, 3] 

На данный момент ary и new_ary точки, чтобы отделить объекты, чтобы изменить одну не влияет на другой.

0

Вы можете использовать метод deep_dup(), который возвращает глубокую копию массива.

ary = [2, 5, 4] 
num = 6 
this = ary.deep_dup 
this << num 

А затем проверить ичных и этот массив:

p this 
=>[2, 5, 4, 6] 
p ary 
=>[2, 5, 4] 
Смежные вопросы