Ruby 二维阵列,推送到一个阵列显示在所有阵列中?

Ruby 二维阵列,推送到一个阵列显示在所有阵列中?,ruby,arrays,multidimensional-array,Ruby,Arrays,Multidimensional Array,我是ruby的新手,所以我显然误解了一些事情。我打算创建一个大小为2的数组,其中每个元素本身就是一个数组,然后将项推送到一个子数组或另一个子数组: #!/usr/bin/env ruby arr = Array.new(2, Array.new) puts 'default, no entries:' arr.each_with_index { |a, i| puts 'arr[' + i.to_s + '] = ' + a.to_s } puts '' puts 'adding "kitt

我是ruby的新手,所以我显然误解了一些事情。我打算创建一个大小为2的数组,其中每个元素本身就是一个数组,然后将项推送到一个子数组或另一个子数组:

#!/usr/bin/env ruby
arr = Array.new(2, Array.new)

puts 'default, no entries:'
arr.each_with_index { |a, i| puts 'arr[' + i.to_s + '] = ' + a.to_s }
puts ''

puts 'adding "kitty" to arr[0]:'
arr[0].push('kitty') # add an element to the sub-array at arr[0]
arr.each_with_index { |a, i| puts 'arr[' + i.to_s + '] = ' + a.to_s }
puts ''

puts 'adding "doggy" to arr[1]:'
arr[1].push('doggy') # add an element to the sub-array at arr[1]
arr.each_with_index { |a, i| puts 'arr[' + i.to_s + '] = ' + a.to_s }
输出:

default, no entries:
arr[0] = []
arr[1] = []

adding "kitty" to arr[0]:
arr[0] = ["kitty"]
arr[1] = ["kitty"]

adding "doggy" to arr[1]:
arr[0] = ["kitty", "doggy"]
arr[1] = ["kitty", "doggy"]

我希望arr[0].push()将元素添加到arr[0][0],这是否错误?

似乎您正在创建一个数组,其中每个元素都是对同一个数组对象的引用:

arr = Array.new(2, Array.new)
#=> [[], []]
arr[0].push(1)
#=> [1]
arr
#=> [[1], [1]]
相反,你应该这样做

arr = [[],[]]
#=> [[], []]
arr[0].push(1)
#=> [1]
arr
#=> [[1], []]

看起来您正在创建一个数组,其中每个元素都是对同一个数组对象的引用:

arr = Array.new(2, Array.new)
#=> [[], []]
arr[0].push(1)
#=> [1]
arr
#=> [[1], [1]]
相反,你应该这样做

arr = [[],[]]
#=> [[], []]
arr[0].push(1)
#=> [1]
arr
#=> [[1], []]
arr=Array.new(2,Array.new)
将相同的数组分配给两个新对象

如果改用块形式,您将得到两个独立的数组:

arr = Array.new(2) { Array.new }
arr=Array.new(2,Array.new)
将相同的数组分配给两个新对象

如果改用块形式,您将得到两个独立的数组:

arr = Array.new(2) { Array.new }

你可以用
arr.map(&:object_id)#=>[70190130252680,70190130252680]
观察这个问题,你可以用
arr.map(&:object_id)#=>[70190130252680,70190130252680]