Iterator да или нет


#1

В проекте BlackBox поля пересылаемых пакетов могут содержать как различные примитивы, массивы примитивов, так и встроенные объекты и их иерархии.

В случае массивов. эти массивы могут быть как предопределенной(вшитой) длинны, так и переменной.
На С если, для получения содержимого поля-массива, пользователю было необходимо, создать в памяти хранилище, под значения, и передать ссылку на хранилище, в функцию получения значений поля.

Внутри этой функции, в цикле, пробегаем по хранимым значениям, иногда производим дополнительные вычисления, чтобы получить реальные значения, и вставляем их в предоставленное хранилище. Всё ОК.

Но.

а что если нужно получить не все значения?

ну тогда пользователь создает хранилище нужного размера, и помимо его, передаем в функцию дополнительные параметры. начиная с какого индекса и сколько элементов нам нужно…

функция подросла в количестве передаваемых аргументов…

а что если нужно только узнать есть ли в массиве поля значения больше 5…???

мы хотим быть эффективными… зачем нам все значения…
отводим массив под одно значение и запрашиваем N раз…

короче, предугадать варианты использования данных хоронящихся в поле-массиве невозможно.

ознакомившись с Rust я постоянно произвожу ревизию своих знаний и представлений о прекрасном. таким образом я обратил внимание на итераторы.

эврика! подумал я, они мне так хорошо знакомы по Scala но…
в проектах, как BlackBox, помимо удобства, важна и производительность.
кода работаешь на ресурсоемком железе - можно и не напрягаться… но я планирую, что мой проект будет работать и на микроконтроллерах.

тесты производимые например на Java показывали существенную деградацию производительности итераторов по сравнению с обычными циклами. и у меня это вшито в подкорке.

однако погружаясь в Rust можно легко обнаружить, что очень, очень многое сделано на итераторах и в документации говорят что итераторы сделаны высоко производительно…

и я начал задумываться, а можно ли в принципе сделать так, чтобы было удобно, в функциональном стиле… и при этом производительно.

Да, компилятор должен будет отличаться умом и сообразительностью, но никаких непреодолимых преград я откровенно говоря не обнаружил.

В итоге я решился, на радикальный шаг:

поля пакета с массивами будут возвращать итераторы!

и пользователь - делай дальше все что тебе угодно.
помимо простого цикла по элементам, дополнительно открывается целая вселенная итератор адаптеров - map, flatmap, filter и прочее.

возможно у кого нибудь есть соображения по теме, и я чего то не учёл;

поделитесь кейсами.

заранее спасибо


Компилятор такое ест. есть ли в этом какая либо польза?