我知道三重循环的想法会让一些人感到恐惧,但我有一个具有以下结构的代码:

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

两个外部循环按预期运行,但由于某些原因,内部循环仅在第一个sentence上运行。你知道为什么吗?我怎样才能使内环也运行在所有的sentences上?
我在Ruby1.8.7上运行,并尝试了上面的相同代码,只使用了each循环,得到了相同的结果。有什么想法吗?
编辑:
myArrayOfFiles是由以下项填充的数组:
AFile = File.open("A.txt")
BFile = File.open("B.txt")
myArrayOfFiles << [Afile,BFile]
myArrayOfFiles.flatten!

最佳答案

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

关于ruby - 三环 ruby ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9051274/

10-14 08:40