意外的数组行为

时间:2009-10-20 21:41:06

标签: ruby arrays variables

以下修改方法会以某种方式修改整个 @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

2 个答案:

答案 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] =部分修改此数组。