В проекте BlackBox поля пересылаемых пакетов могут содержать как различные примитивы, массивы примитивов, так и встроенные объекты и их иерархии.
В случае массивов. эти массивы могут быть как предопределенной(вшитой) длинны, так и переменной.
На С если, для получения содержимого поля-массива, пользователю было необходимо, создать в памяти хранилище, под значения, и передать ссылку на хранилище, в функцию получения значений поля.
Внутри этой функции, в цикле, пробегаем по хранимым значениям, иногда производим дополнительные вычисления, чтобы получить реальные значения, и вставляем их в предоставленное хранилище. Всё ОК.
Но.
а что если нужно получить не все значения?
ну тогда пользователь создает хранилище нужного размера, и помимо его, передаем в функцию дополнительные параметры. начиная с какого индекса и сколько элементов нам нужно…
функция подросла в количестве передаваемых аргументов…
а что если нужно только узнать есть ли в массиве поля значения больше 5…???
мы хотим быть эффективными… зачем нам все значения…
отводим массив под одно значение и запрашиваем N раз…
короче, предугадать варианты использования данных хоронящихся в поле-массиве невозможно.
ознакомившись с Rust я постоянно произвожу ревизию своих знаний и представлений о прекрасном. таким образом я обратил внимание на итераторы.
эврика! подумал я, они мне так хорошо знакомы по Scala но…
в проектах, как BlackBox, помимо удобства, важна и производительность.
кода работаешь на ресурсоемком железе - можно и не напрягаться… но я планирую, что мой проект будет работать и на микроконтроллерах.
тесты производимые например на Java показывали существенную деградацию производительности итераторов по сравнению с обычными циклами. и у меня это вшито в подкорке.
однако погружаясь в Rust можно легко обнаружить, что очень, очень многое сделано на итераторах и в документации говорят что итераторы сделаны высоко производительно…
и я начал задумываться, а можно ли в принципе сделать так, чтобы было удобно, в функциональном стиле… и при этом производительно.
Да, компилятор должен будет отличаться умом и сообразительностью, но никаких непреодолимых преград я откровенно говоря не обнаружил.
В итоге я решился, на радикальный шаг:
поля пакета с массивами будут возвращать итераторы!
и пользователь - делай дальше все что тебе угодно.
помимо простого цикла по элементам, дополнительно открывается целая вселенная итератор адаптеров - map, flatmap, filter и прочее.
возможно у кого нибудь есть соображения по теме, и я чего то не учёл;
поделитесь кейсами.
заранее спасибо