«Путь ржавчины» - это путь, который не ведет к небезопасной памяти. Ваш код недействителен, как говорит вам компилятор:
error[E0597]: `person` does not live long enough
--> src/main.rs:13:26
|
13 | personrefs.push(&person);
| ^^^^^^ borrowed value does not live long enough
14 | persons.push(person);
15 | }
| - `person` dropped here while still borrowed
16 | println!("persons are {:#?}", persons);
17 | }
| - borrowed value needs to live until here
Вы создаете Person
внутри цикла, беря ссылку на него, затем перемещая Person
на новый адрес памяти , аннулируя ссылку. Если вы получили доступ к этой ссылке, вы бы прикоснулись к неопределенной памяти, что в лучшем случае привело бы к segfaults или к «странному поведению» / уязвимостям безопасности в худшем случае.
Аналогично, вы не можете добавить человека в Vec
и затем взять ссылку на этого человека в цикле, потому что последующая итерация цикла будет мутировать вектор. Когда вы нажимаете на вектор, он может перераспределить память, снова делая ваши ссылки недействительными.
Я бы написал этот код как
fn main() {
let persons: Vec<_> = (0..3)
.map(|x| Person {
name: format!("Alice-{}", x),
})
.collect();
let personrefs: Vec<_> = persons.iter().collect();
println!("persons are {:#?}", persons);
}