我对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]]
有人可以向我解释为什么会这样吗?我该怎么办呢?
非常感谢,
答案 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