Да, CachingIterator
будет добавлять элементы постепенно. В списке из 3 элементов, если в первый раз произошла одна итерация, то кеш будет содержать 1 элемент. Если в следующий раз произойдут 2 итерации, первый элемент будет извлечен из кеша, а второй - из внутреннего списка, а затем кеширован. Et c et c.
Это проиллюстрировано здесь . Обратите внимание, что в первый раз в выходном массиве один элемент, а во второй - два. Также обратите внимание на то, что первый объект - это тот же объект в обоих случаях, о чем свидетельствует номер объекта, например #1
.
Кроме того, если ваши значения не являются строковыми, т. Е. Не могут быть преобразованным в строку, не забудьте удалить флаг CALL_TOSTRING
по умолчанию или использовать FULL_CACHE
. В противном случае вы получите ошибку. Подробнее здесь
Еще одна деталь заключается в том, что если где-то в цепочке итераторов под CachingIterator
есть Генератор , то CachingIterator
нельзя перемотать, а это значит, что его нельзя б / у более 1 foreach
л oop. Это противоречит интуиции IMO, потому что я ожидал, что, если он кеширует, он будет перебирать кеш. Однако очевидно, что он все еще пытается перемотать внутренний итератор, который пересылает его вниз по цепочке к генератору, что в конечном итоге приводит к фатальной ошибке.