Проблема с вашим кодом в том, что когда вы создаете duck
, он находится внутри блока цикла for, заставляя его существовать, пока существует цикл for, чтобы исправить это, вам нужно передать владениеот duck
до vec_ducks
.
В вашем коде:
let mut vec_ducks: Vec<&Duck> = vec![];
for i in 0..100 {
let _x = rand::thread_rng().gen_range(0, 100);
let _y = rand::thread_rng().gen_range(0, 100);
let duck = Duck{x:_x,y:_y}; // duck is created here
vec_ducks.push(&duck);
//println!("{}", i);
} // duck is dropped or out of scope here
for d in &vec_ducks { // you try to use values of duck here, where they no longer exist
d.quack();
}
Измените код на:
// take Duck and not a reference to it
let mut vec_ducks: Vec<Duck> = vec![];
for i in 0..100 {
let _x = rand::thread_rng().gen_range(0, 100);
let _y = rand::thread_rng().gen_range(0, 100);
let duck = Duck{x:_x,y:_y};
// move ownership
vec_ducks.push(duck);
//println!("{}", i);
}
for d in &vec_ducks {
d.quack();
}
Более подробно пример в Мягкое введение работает, потому что duck1
и duck2
находятся в той же области действия / блоке, что и ducks
, то есть основной блок.
Подробнее о владении и сроке службы можно прочитать здесь и здесь