2015-05-20 109 views
0

我的目標是取多維數組中的每個元素,創建12個將被處理的副本(不更改原始值),將處理後的值附加到數組,並在必要時重複以滿足總數期望值:Ruby Infinite While Loop

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 

這部分代碼創建了一個無限循環。我不明白爲什麼。

回答

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

arrtmp是相同的對象。在增加到arr時,tmp增長,因此tmp.each需要處理新的子陣列。

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 
-1

只使用

arr += new_arr 

,而不是

arr.concat new_arr 
+0

提供答案幫助,但回答爲什麼創建一個無限循環會使它好多了 –

+0

它已經在上面解釋過了.. – emvee

+0

然後你沒有回答這個問題 – Cristik