Добрый день.
Новичок в Rust. Есть проблемы.
Есть объект market, в котором есть вектор persons, в котором хранятся структуры с данными Person. Мне необходимо изменить две структуры одновременно. Пытаюсь делать это с помощью следующего кода:
market.persons[k: usize].some_fn(&mut market.persons[i: usize]);
и ничего не получается. Выдает ошибку
error[E0499]: cannot borrow market.persons as mutable more than once at a time
то есть, компилятор считает, что мы изменяем вектор market.persons, хотя нам надо только изменить находящиеся в этом векторе объекты.
Подскажите, пожалуйста, как корректно изменить структуры, хранящиеся в векторе, одновременно (в одной функции)?
то есть, компилятор считает, что мы изменяем вектор market.persons, хотя нам надо только изменить находящиеся в этом векторе объекты.
Это не вполне верный вывод. С точки зрения Rust модификация любого элемента коллекции эквивалентна модификации всей коллекции целиком, так что компилятор корректно указывает на ошибку.
В данном конкретном случае ошибка компилятора защищает вас от так называемого алиасинга мутабельных ссылок – ситуации, когда две мутабельные ссылки указывают на одну и ту же область оперативной памяти. Если не знаете, что это значит и зачем это нужно, рекомендую доклад: https://youtu.be/ACW-7dktyDk
В данном случае компилятор не может доказать, что k != i – система типов просто не достаточно мощная. Вариантов решения несколько: (в произвольном порядке)
Каким-либо образом отрефакторить код, чтобы брать две ссылки одновременно не требовалось. Точно ли изменение необходимо осуществлять одновременно? Возможно копирование будет достаточно дешевым, чтобы не брать вторую ссылку?
Использовать unsafe и написать вспомогательный метод, который будет возвращать две независимые ссылки, сформированные и сырых указателей. Для вдохновления можно посмотреть на реализацию из следующего пункта.
В nightly-компиляторе есть новый метод slice::get_many_mut который уже написан за вас и делает то, что нужно.
И опять полезли ошибки: error[E0554]: #![feature] may not be used on the stable release channel ; error[E0658]: use of unstable library feature ‘get_many_mut’
Установил nightly. Всё заработало. Еще раз спасибо)