Трехконтурный рубин - PullRequest
       15

Трехконтурный рубин

2 голосов
/ 29 января 2012

Я знаю, что идея тройного цикла вызывает у некоторых страх, но у меня есть код со следующей структурой:

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!

1 Ответ

7 голосов
/ 29 января 2012

Ваша проблема в том, что 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
...