Как могут новые участники сохраняться при нажатии на Vec в цикле for? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь научиться использовать объекты в Rust путем взлома.Следующий код предсказуемо дает «заимствованное значение не живет достаточно долго», но я не уверен, что изменить.Каков подход к созданию группы экземпляров в цикле for, к которым затем можно получить доступ вне его?

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 };

    vec_ducks.push(&duck);

    //println!("{}", i);
}

for d in &vec_ducks {
    d.quack();
}

1 Ответ

0 голосов
/ 03 апреля 2019

Проблема с вашим кодом в том, что когда вы создаете 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, то есть основной блок.

Подробнее о владении и сроке службы можно прочитать здесь и здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...