嵌套阵列初始化&&作业奇怪

时间:2014-04-09 03:51:32

标签: ruby arrays initialization

在Array初始化中发生了什么导致int赋值的差异?

arr = Array.new(3) { Array.new(3) { Array.new(3) } }
3.times do |x|
  3.times do |y|
    3.times do |z|
      arr[x][y][z] = Random.rand(1..9)
    end
  end
end
puts arr.to_s
#=> [[[3, 3, 1], [4, 9, 6], [2, 4, 7]], [[1, 6, 8], [9, 8, 5], [1, 7, 5]], [[2, 5, 9], [2, 8, 8], [9, 1, 8]]]
#=> [[[2, 4, 4], [6, 8, 9], [6, 2, 7]], [[2, 7, 7], [2, 1, 1], [8, 7, 7]], [[5, 3, 5], [3, 8, 1], [7, 6, 6]]]
#=> [[[4, 9, 1], [1, 6, 8], [9, 2, 5]], [[3, 7, 1], [7, 5, 4], [9, 9, 9]], [[6, 8, 2], [8, 2, 8], [2, 9, 9]]]

arr = Array.new(3, Array.new(3, Array.new(3)))
3.times do |x|
  3.times do |y|
    3.times do |z|
      arr[x][y][z] = Random.rand(1..9)
    end
  end
end
puts arr.to_s
#=> [[[8, 2, 4], [8, 2, 4], [8, 2, 4]], [[8, 2, 4], [8, 2, 4], [8, 2, 4]], [[8, 2, 4], [8, 2, 4], [8, 2, 4]]]
#=> [[[2, 1, 4], [2, 1, 4], [2, 1, 4]], [[2, 1, 4], [2, 1, 4], [2, 1, 4]], [[2, 1, 4], [2, 1, 4], [2, 1, 4]]]
#=> [[[2, 7, 6], [2, 7, 6], [2, 7, 6]], [[2, 7, 6], [2, 7, 6], [2, 7, 6]], [[2, 7, 6], [2, 7, 6], [2, 7, 6]]]

1 个答案:

答案 0 :(得分:1)

使用new(size=0, obj=nil)初始化数组时:

来自doc:

  

在第一种形式中,如果没有发送参数,则新数组将是   空。发送大小和可选obj时,会创建一个数组   与obj的大小副本。请注意所有元素都会引用   同一个对象obj

如果你想要多个副本,那么你应该使用每次需要初始化数组元素时使用该块结果的块版本。