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