我想创建一个包含 n
个不同的空子数组的数组。
这是最好的方法吗?
Array.new(n){ [] }
原来是这样的,看了评论修改了:
Array.new(n){ |_| [] }
我试过:
Array.new(n, [])
但它创建了一个数组,其中所有子数组都是同一个对象,这是我不想要的。
最佳答案
所有建议的获取此数组的方法 [[], [], [],...]
工作正常:
Array.new(n, []) # the best, 20 times faster
Array.new(n){ [] }
n.times.map { [] }
第一个是最快的,所以是最好的,但工作起来很奇怪(见下一个)。
it created an array with all the sub arrays being the same object
如果我明白了,您的意思是所描述的方法会发生以下情况:
a = Array.new(5, [])
p a # => [[], [], [], [], [], [], [], [], [], []]
p a.map { |e| e.object_id} # => [70189488740180, 70189488740180, 70189488740180, 70189488740180, 70189488740180]]
对象是相同的,因此如果您尝试用值填充子数组,所有子数组都将采用相同的值(复制):
a[0][0] = 10
p a # => [[10], [10], [10], [10], [10]]
为避免这种情况,不要传递默认值,而是映射到空数组:
a = Array.new(5).map{ |e| [] }
p a # => [[], [], [], [], []]
或者通过方 block
a = Array.new(5){ [] }
a = 5.times.map { [] }
现在每个子数组都是一个独立的对象:
p a.map { |e| e.object_id} # => [70253023825640, 70253023825620, 70253023825600, 70253023825580, 70253023825560]
如果您插入一些值,则不会复制:
a[0][0] = 10
a[1][0] = 20
p a # => [[10], [20], [], [], []]
关于arrays - 在 Ruby 中创建空子数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51924291/