2009-10-20 4 views
-2

Способ изменить способ как-то модифицирует массив @x вместо простого создания другого элемента, который будет вытолкнут позже. Как так?Неожиданное поведение массива

def modify i, s 
    t = @x[-1] 
    t[i] = t[i] + s 
    t 
end 

@x = [ [10, 12] ] 
@x << modify(0, 1) 

puts @x 

Edited Следующий код сделал трюк. Еще мне интересно, если его можно избавиться от р-аргумента

def modify p, i, s 
    a = p.to_a 
    a[i] += s*@delta[i] 
    Vector.elements(a) 
end 
+3

Можете ли вы уточнить, что вы пытаетесь достичь здесь. Что вы хотите, чтобы этот метод выполнялся? Кроме того, почему вы ссылаетесь на конкретную переменную экземпляра ('@ x') в методе, а не, скажем, на' self'? – Telemachus

+0

ясно, почему этот метод изменяет всю @x. непонятно, чего вы пытаетесь достичь. Каково применение этого? можете ли вы подробно остановиться на контексте? – avguchenko

+0

Я пытаюсь изменить общий вектор (@x [-1]), а затем нажать модифицированную версию в массив @x. – gmile

ответ

0

@x[-1] является внутренний массив [10, 12]. Вы устанавливаете t для ссылки на этот массив. Затем вы модифицируете этот массив с помощью части t[i] =.

+0

как установить t-переменную не для ссылку, но только выбрать значение? – gmile

+2

Клонировать его. 't = @x [-1] .clone' – Chuck

+0

потерять t [i] = и заменить его любой новой переменной – avguchenko

1

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

Если вы хотите вернуть один Fixnum элемента:

def modify i, s 
    t = @x[-1] 
    r = t[i] + s 
    r 
end 

или, если вы хотите, чтобы вернуть массив, чтобы ввести в больший массив кортежей

def modify i, s 
    t = @x[-1].dup 
    t[i] = t[i] + s 
    t 
end 

В духе понимания , вы должны прочитать объекты Ruby и как они являются ссылками и как методы Ruby имеют побочные эффекты.

Исследование это:

a=[1,2] 
b=a 
b[0]=4 
puts a 
> [4,2] 

Вы можете захотеть сделать простофиля

a=[1,2] 
b=a.dup 
b[0]=4 
puts a 
> [1,2] 
+0

слишком много под-переменных ... есть шанс передать значение, а не ссылку *? – gmile

+0

@Bob Aman: здесь нам не нужен обман, потому что я изменил t [i] = ... на r = ... – avguchenko

+0

Это не только устраняет побочный эффект, но и изменяет тип возвращаемого метода. Раньше он возвращал массив. Эта версия возвращает целое число. Поскольку это, кажется, массив массивов, это, вероятно, неверно. – Chuck