Раст только начал щупать. И естественно всякие непонятки с поведением "borrowed content".
Вот, например, есть вектор структур, и я хочу что-то сделать с содержимым нескольких элементов этого вектора.
Передаю в функцию мутабельные ссылки. И получаю:
131 | foo(&mut v[0], &mut v[1]);
| --- - ^ second mutable borrow occurs here
| | |
| | first mutable borrow occurs here
| first borrow later used by call
Для пробы я попробовал вызов для пары обычных переменных на стеке. Всё ожидаемо работает.
Есть обходной манёвр с двойным копированием, который дико выглядит.
Кстати почему не компилируется?
let mut va : P = v[0];
Обязательно требуется клонирование
Собственно код, тут сразу все три варианта...
#[derive(Debug, Clone)]
struct P {
x : i32,
y : i32
}
fn foo(a : &mut P, b : &mut P)
{
a.x = b.x + 1;
b.y = a.y + 1;
}
fn main()
{
// Это ожидаемо работает
let mut a = P{x:1, y:2};
let mut b = P{x:10, y:20};
foo(&mut a, &mut b);
println!("{:?} {:?}", a, b);
let mut v : Vec<P> = [
P{x:1, y:2},
P{x:10, y:20}
].to_vec();
// А это уже нет !!!
// foo(&mut v[0], &mut v[1]);
// Так можно "обойти", но это явно не то ради чего придумывался rust
let mut va : P = v[0].clone();
let mut vb : P = v[1].clone();
foo(&mut va, &mut vb);
v[0] = va;
v[1] = vb;
println!("{:?}", v);
}