бы банальной проблеме - у нас есть список каких-то данных, и как обычно водится, он обернут в какую-нибудь структуру с узнаваемым именем.
Хочется манипулировать списком и не сойти с ума.
У нас есть пара вариантов как это сделать:
1. сделать структурку мутабельной и по-классике пихать туда новые данные, типа fn update(&mut self). Максимально простой подход со всеми вытекающими. Работает пока у нас один поток, иначе мы начинаем кушать кактус с Arc<Mutex<...>> и прочими прелестями
2. Использовать копи он врайт (так сказать функциональщина на пол шишечки), который ушатает производительность в ноль и сожрет все ресурсы в любом мало мальски работающем приложении https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ddf9272edeee2f59d0ebf92d65dddbc5
3. взять помесь функциональщины и плюс съемулировать джаву или любой другой язык с GC.
То есть напихать вместо данных, ссылки на данные и тогда производительность пункта 2 хоть как-то улучшиться, только непонятно почему я корячусь и эмулирую джаву тогда? Зачем мне тогда все эти прелести без гарбадж коллектора?
struct Data {
list: Vec<Rc<Data>>
}
собственно на каждую вставку пересоздавать лист, только теперь из-за того что у нас ссылки, по идее должно быть подешевле в целом по больнице
4. Не извращаться, а взять наконец нормальные персистентные коллекции и писать в функциональном виде.
Четвертый вариант был бы наверное идеальным, если бы не ржавое сообщество, залупившееся непонятно почему и уперлись в классические структуры данных.
В итоге ты стоишь раком и не можешь разогнуться, потому что раст остановился где-то на пол пути к функциональщине и в итоге ни один из способов не работает нормально, всё через жопу. Ходишь по кругу между этими подходами и ни один из них не подходит как полноценное решение
непонятно что с этим делать, а ведь это самая базовая вещь которая нужна чуть ли не каждый день
люди добрые, вразумите, что делать, ну или просто пните ногой и скажите что все не так однозначно и я ничего не понимаю
1 - ну так каналы используй, чтобы с мутексами не мучатся; 4 - с растом такая история что те проблемы мутабельности, которые в чистой функциональщине решаются запретом оной, в расте решаются его системой типов
1. каналы не даются бесплатно, появляется асинхронное взаимодействие на ровном месте от чего возрастает сложность 4. а можете пример показать пример а то не очень понятно что вы имеете ввиду?
>системой типов Не, вообще не :D, она тут много менее мощная, чем в фпшках
их и синхронно можно использовать
тут нельзя определённо сказать более или менее, она другая, и для системного программирования с его большой императивностью, по идее, более подходящая
А что не так с мьютаксом?
Для многопоточного сценария можно посмотреть в сторону lock-free алгоритмов и структур данных Не нашел доклад, который мне запомнился больше всего, но вот другой https://youtu.be/XKODaZgKcnE?si=bkPd8HQs0_68oVu6
Скорее всего уже есть крейты с lock-free контейнерами
Вот! Очень понравился доклад https://youtu.be/Z-2siR9Ki84?si=h3GIvMQ9z3hTu9Gt
QSBR не пробовали?
Смотрел про Yoke?
Обсуждают сегодня