endless_lama
Но я не очень понимаю, зачем нужно, чтобы self.cache_index = 0? Зачем нужно его каждый раз ресетить?
Этот итератор достаёт правила из файла. Когда он достаёт правило, он его записывает в кеш. А тому, кто использует этот итератор, нужно получить первое подходящее правило. То есть может получиться ситуация, где нужное правило находится в середине файла. После того как правило найдено, итератор отбрасывается и больше не используется.
И вот тут у нас появляется необходимость второй раз перебрать
все правила. Тогда этот итератор снова берётся, но в нём есть закешированные правила. Кеш работает быстрее, чем чтение из файла, а указатель файла стоит где-то в середине файла. Поэтому мы сначала ищем правило в кеше (ведь там может оказаться нужное правило), а если оно не найдено там, то мы продолжаем читать файл и кешировать правила дальше.
Например:
У тебя есть три слова, которые надо обработать, каждое по своему правилу.
Для первого слова подходит десятое правило. Ты десять правил прочитал и закешировал, а последнее из них ещё вернул наружу и преобразовал по нему первое слово.
Для второго слова подходит пятое правило. В кеше есть десять правил, поэтому из файла читать уже ничего не надо. Ты с начала кеша дошёл до пятого правила, вернул его наружу и преобразовал по нему второе слово.
Для третьего слова подходит двадцатое правило. Сначала ты проходишь весь кеш и понимаешь, что там этого правила нет. Тогда ты продолжаешь читать файл и читаешь ещё десять правил из него и кешируешь их. Когда двадцатое правило прочитано и закешировано, ты его возвращаешь наружу и преобразовываешь по нему третье слово.
Теперь у тебя в кеше двадцать правил, а в файле осталось ещё десять правил. Любое следующее слово теперь будет искать сначала в кеше среди двадцати правил подходящее. При этом в файле есть ещё правила, если этих двадцати правил в кеше не хватит. Когда весь файл будет прочитан, все правила будут только в кеше. Но если у тебя сто слов, для которых нужно только первое правило, то из файла будет прочитано только первое правило, а дальше все слова будут преобразованы по правилу из кеша. То есть файл вообще читаться не будет, только одно правило прочитает из него и всё.