Ruby Infinite While Loop

时间:2015-05-20 17:50:47

标签: arrays ruby infinite-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

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

4 个答案:

答案 0 :(得分:1)

您的问题在于tmparr一起分配。它们与您在此处看到的对象相同:

> 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它应该解决你的问题。

答案 1 :(得分:1)

arrtmp是同一个对象。在添加到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