我的目标是将每个元素放在多维数组中,创建将要处理的12个副本(不更改原始值),将处理后的值附加到数组中,并在必要时重复以满足所需值的总数:
total = 4
arr = Array.new(1) { Array.new(3, 127.5) }
while arr.count < total
tmp = arr
tmp.each do |item|
new_arr = Array.new(12, item)
#processing the 12 arrays I just created would happen here
arr.concat new_arr
puts arr.count
end
end
这部分代码创建了一个无限循环。我不明白为什么。
答案 0 :(得分:1)
您的问题在于tmp
与arr
一起分配。它们与您在此处看到的对象相同:
> arr = [1,2,3]
=> [1, 2, 3]
> tmp = arr
=> [1, 2, 3]
> arr.concat([4,5,6])
=> [1, 2, 3, 4, 5, 6]
> tmp
=> [1, 2, 3, 4, 5, 6]
您需要使用dup
或clone
等待您的需求制作数组的副本
如果你tmp = arr.dup
它应该解决你的问题。
答案 1 :(得分:1)
arr
和tmp
是同一个对象。在添加到arr
时,tmp
会增长,因此tmp.each
有新的子阵列需要处理。
答案 2 :(得分:0)
您的无限循环正在发生,因为您正在其中的第二个循环中向数组添加项目,因此后续迭代将对先前添加的条目起作用。另外,当你执行'tmp = arr'时,你没有复制arr,你正在设置一个引用。看看这个,看看它是否有帮助:
> arr = ['test','test1','test2']
=> ["test", "test1", "test2"]
> tmp = arr
=> ["test", "test1", "test2"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
> tmp = arr.dup
=> ["test", "test1", "test2", "test3"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
考虑到这一点,也许你可以尝试类似的东西:
total = 4
original_arr = Array.new(1) { Array.new(3, 127.5)}
new_arr = []
total.times do |i|
original_arr.each do |v|
new_arr << Array.new(12, v)
puts i
end
end
答案 3 :(得分:-1)
只需使用
arr += new_arr
而不是
arr.concat new_arr