Вы не можете сделать это. Это просто замаскированный классический пример «векторного толчка». Давайте посмотрим на этот упрощенный, но семантически эквивалентный код:
let mut v = Vec::new();
v.push(27);
let twenty_seven = v.last().unwrap();
v.push(3);
println!("{}", twenty_seven);
Это не компилируется и никогда не будет компилироваться в Rust, поскольку это по своей природе небезопасно для памяти. У вас есть ссылка (указатель) на элемент в векторе. Но вызов Vec::push
может перераспределить, аннулируя все ссылки на его элементы. В C ++ он компилируется, но приводит к UB, потому что вы пытаетесь прочитать неинициализированную или нераспределенную память.
«Ответ» на вашу проблему ... не простой. Вы должны подумать о другой структуре вашей программы. Иногда полезно использовать умные указатели с подсчетом ссылок (например, Rc
). И это легко решит вашу проблему. Но во многих других ситуациях вам лучше полностью переосмыслить свое приложение.