Ruby 无限循环

Ruby Infinite While Loop

我的目标是获取多维数组中的每个元素,创建 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

这部分代码创建了一个无限循环。我不明白为什么。

您的问题是将 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]

您需要根据需要使用 dupclone 来制作数组的副本

如果您这样做 tmp = arr.dup 它应该可以解决您的问题。

arrtmp 是同一个对象。添加到 arr 时,tmp 会增长,因此有新的子数组供 tmp.each 处理。

您的无限循环正在发生,因为您在其中的第二个循环中向数组添加项目,因此后续迭代将作用于先前添加的条目。此外,当您执行 '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

只需使用

arr += new_arr

而不是

arr.concat new_arr