我想创建一个which scriptcs
个不同的空子数组。
这是最好的方法吗?
n
如下,但是我在阅读评论后进行了修改:
Array.new(n){ [] }
我尝试过:
Array.new(n){ |_| [] }
但是它创建了一个数组,所有子数组都是同一个对象,我不希望这样做。
答案 0 :(得分:1)
Array.new(n){ [] }
很好!该块可确保创建新的Array实例n次。正如您所指出的,否则您将多次引用同一对象(Array的实例)。
答案 1 :(得分:1)
所有建议的用于获取数组[[], [], [],...]
的方法都可以正常工作:
Array.new(n, []) # the best, 20 times faster
Array.new(n){ [] }
n.times.map { [] }
第一个是最快的,所以是最好的,但是效果很奇怪(请参阅下一个)。
它创建了一个数组,所有子数组都是同一个对象
如果我明白这一点,那么您的意思是所描述的方法会发生以下情况:
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 # => [[], [], [], [], []]
或通过障碍
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], [], [], []]
答案 2 :(得分:0)
请尝试这个。它对我有用。
n = 15
arr = Array.new(n)
arr.map!{ |x| x = [] }
现在,将值放入数组中。
arr[0][0] = 10
arr[5][0] = 50
p arr # => [[10], [], [], [], [], [50], [], [], [], [], [], [], [], [], []]