以下修改方法会以某种方式修改整个 @x 数组,而不仅仅是生成另一个稍后要推送的元素。怎么样?
def modify i, s
t = @x[-1]
t[i] = t[i] + s
t
end
@x = [ [10, 12] ]
@x << modify(0, 1)
puts @x
被修改 以下代码完成了这一操作。我仍然想知道它是否有可能摆脱p论证
def modify p, i, s
a = p.to_a
a[i] += s*@delta[i]
Vector.elements( a )
end
答案 0 :(得分: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]
答案 1 :(得分:0)
@x[-1]
是内部数组[10,12]。您设置t
以引用此数组。然后使用t[i] =
部分修改此数组。