Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将数组存储到另一个数组中,是否会得到意外结果?_Ruby On Rails_Ruby_Arrays_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 将数组存储到另一个数组中,是否会得到意外结果?

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。然后

我对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,现在它在其中有两次相同的数组

您可能需要将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