Найти тему
10 подписчиков

Накидал целую кучу лайфтаймов и смог вернуть из функции своё первое юзабельное замыкание использующее ссылки, а не Arc/Rc/перемещение значения.


На данный момент я понимаю это так:

◾️ Есть время жизни 'a, все ссылки которые я передаю в эту функцию будут столько жить (кроме generation_id, он просто мне в замыкании не нужен и не трогал его лайфтайм)
◾️ Функция возвращает замыкание, которое тоже имеет время жизни 'a (хотя я пока не уверен, что правильно понимаю этот плюс; отдельно что такое dyn вроде как понятно, отдельно лайфтайм более или менее понятен, а что там куда плюсуется пока не очень)
◾️ Соответственно внутри этого замыкания можно без проблем продолжать пользоваться ссылками &'a, они будут валидны одно и то же время, замыкание не переживёт данные, у которых одолжили ссылки
◾️ Затем я вызываю эту функцию в функции рядышком, где не теряю владение над данными (не деструктурирую) до момента как деструктурирую замыкание — и всё сходится

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

А в общем смысл такой, что у меня при записи ключей есть опция ifNotPresent: true, которая если включена, то если попросят добавить два значения с одинаковыми ключами одновременно, то нужно записать только одно и вернуть в результате, записалось оно или нет. При этом можно игнорировать случаи, когда происходят одновременные записи с таким параметром и без него (если наврём про то что он записался, то когда к нам придут можем сказать, что он то записался, но запрос без опции обрабатывался вторым и перетёр).

#rust
Накидал целую кучу лайфтаймов и смог вернуть из функции своё первое юзабельное замыкание использующее ссылки, а не Arc/Rc/перемещение значения.
1 минута