2012-01-29 126 views
2

我知道一個三重循環的理念帶來了恐懼的一些想法,但我有以下結構的代碼:三環路紅寶石

paragraph.split(/(\.|\?|\!)[\s\Z]/).each do |sentence| 
    myArrayOfFiles.each_with_index { |ma,j| 
     ma.each_with_index { |word,i| 
      sentence.gsub!(...) 
     } 
    } 
end 

如預期運行的兩個外循環,但對於某些原因,內部循環僅在第一個sentence上運行。你知道這是爲什麼嗎?我怎樣才能讓內循環遍歷所有sentence

我在Ruby 1.8.7上運行,並嘗試使用上述相同的代碼只使用each循環,並得到相同的結果。有任何想法嗎?

編輯:

myArrayOfFiles是填補了一個數組:

AFile = File.open("A.txt") 
BFile = File.open("B.txt") 
myArrayOfFiles << [Afile,BFile] 
myArrayOfFiles.flatten! 
+0

是'sentence'被用於何處? – 2012-01-29 06:09:55

+1

什麼是「有些東西」? 「myArrayOfFiles」的元素是什麼樣的? – 2012-01-29 06:13:37

+0

'句子'在內部循環中使用。 – zanbri 2012-01-29 06:13:39

回答

7

您的問題是myArrayOfFiles包含文件的情況。當你用ma.each_with_index遍歷其中一個文件時,它將逐行掃描文件並停在EOF處。然後,您嘗試再次使用下一個sentence進行迭代,但是文件已經在EOF中,因此ma.each_with_index沒有任何內容可以迭代,並且沒有發生任何有趣的事情。你需要調用rewind移動文件返回到開始嘗試之前再次each_with_index他們:

paragraph.split(/(\.|\?|\!)[\s\Z]/).each do |sentence| 
    myArrayOfFiles.each_with_index do |ma, j| 
     ma.rewind # <------------------------- You need this 
     ma.each_with_index do |word, i| 
      sentence.gsub!(...) 
     end 
    end 
end 
+0

非常棒!所以如果我理解正確,這個邏輯適用於任何類型的循環。謝謝! – zanbri 2012-01-29 14:22:16

+0

@zanbri:對,你的循環不是問題,文件是。 – 2012-01-29 16:56:37