Ruby on rails 将数组存储到另一个数组中,是否会得到意外结果?
我对Ruby完全陌生。我遇到了一些我无法解释的事情 这是我的密码:Ruby on rails 将数组存储到另一个数组中,是否会得到意外结果?,ruby-on-rails,ruby,arrays,ruby-on-rails-3,Ruby On Rails,Ruby,Arrays,Ruby On Rails 3,我对Ruby完全陌生。我遇到了一些我无法解释的事情 这是我的密码: arr1 = [] arr2 = [0] 5.times{ arr2[0] += 1 arr1 << arr2 } puts "result = #{arr1}" 然而,我得到的结果是: result = [[5],[5],[5],[5],[5]] 有人能解释一下为什么会这样吗?我怎么能修好它 非常感谢,因此,您不仅仅是将arr1的值添加到arr2中。实际上,您正在将arr1本身添加到arr2。然后
arr1 = []
arr2 = [0]
5.times{
arr2[0] += 1
arr1 << arr2
}
puts "result = #{arr1}"
然而,我得到的结果是:
result = [[5],[5],[5],[5],[5]]
有人能解释一下为什么会这样吗?我怎么能修好它
非常感谢,因此,您不仅仅是将arr1的值添加到arr2中。实际上,您正在将arr1本身添加到arr2。然后再次将arr1添加到arr2,现在它在其中有两次相同的数组 您可能需要将arr1的副本添加到arr2
arr1 << arr2.dup
arr1我看到的问题是您更改可变结构的值
您不断地修改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+=arr2
。我认为正在发生的是,您添加了五次相同的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