将数组存储到另一个数组中,获得意外结果?

时间:2015-04-14 02:32:08

标签: ruby-on-rails ruby arrays ruby-on-rails-3

我对Ruby完全不熟悉。我遇到了一些我无法解释的事情。

这是我的代码:

arr1 = []
arr2 = [0]

5.times{
  arr2[0] += 1
  arr1 << arr2
  }
puts "result = #{arr1}"

我期待以下结果:

result = [[1],[2],[3],[4],[5]]

然而,这是我得到的结果:

result = [[5],[5],[5],[5],[5]]

有人可以向我解释为什么会这样吗?我该怎么办呢?

非常感谢,

2 个答案:

答案 0 :(得分:2)

所以,你不只是将arr1的值添加到arr2。您实际上是将arr1本身添加到arr2。然后你再次将arr1添加到arr2,现在它在那里有两次相同的数组。

您可能希望将arr1的副本添加到arr2。

arr1 << arr2.dup

答案 1 :(得分:0)

我看到的问题是你改变了可变结构的价值。

你不断改变arr2并将同一个实例插入arr1

如果您追踪执行

arr2[0] +=1  # arr1 = [],    arr2 = [1]
arr1 << arr2 # arr1 = [[1]], arr2 = [1]

arr2[0] +=1  # arr1 = [[2]],     arr2 = [2]
arr1 << arr2 # arr1 = [[2],[2]], arr2 = [2]

arr2[0] +=1  # arr1 = [[3],[3]],     arr2 = [3]
arr1 << arr2 # arr1 = [[3],[3],[3]], arr2 = [3]

...

您可以通过执行以下操作验证它与您插入的实例相同:

arr1.map(&:hash).uniq