2009-10-20 87 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 

編輯 下面的代碼做的伎倆。仍然不知其可能擺脫對參數

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阿曼:這裏我們不需要重複,因爲我改變了t [i] = ...到r = ... – avguchenko

+0

這不僅消除了副作用,它還改變了方法的返回類型。以前,它返回一個數組。該版本返回一個整數。由於它看起來是一個數組數組,所以這可能是不正確的。 – Chuck