Как могут сохраняться новые элементы при отправке в Vec в цикле for?

#rust

#Ржавчина

Вопрос:

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

 let mut vec_ducks: Vec<amp;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(amp;duck);

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

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

Комментарии:

1. почему вы берете ссылку на duck ?

2. «создание множества экземпляров в цикле for, к которым затем можно получить доступ [редактировать] вне его» — разве это не именно то, что пытается предотвратить средство проверки заимствований?

3. «Пытаясь изучить ООП», Rust обычно не считается языком ООП.

4. @Shepmaster Я работаю с: stevedonovan.github.io/rust-gentle-intro /…

5. @prismspecs этот ресурс, похоже, предназначен для обучения Rust людей, имеющих опыт работы с ООП; если вы пытаетесь изучить ООП, я не уверен, что это хороший путь.

Ответ №1:

Проблема с вашим кодом заключается в том, что при создании duck он находится внутри блока цикла for, что приводит к его существованию до тех пор, пока существует цикл for, чтобы исправить это, вам нужно передать право собственности на duck vec_ducks .

В вашем коде:

 let mut vec_ducks: Vec<amp;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(amp;duck);

    //println!("{}", i);
} // duck is dropped or out of scope here

for d in amp;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 amp;vec_ducks {
    d.quack();
}
  

Более того, пример в мягком введении работает, потому что duck1 и duck2 находятся в той же области / блоке, что и ducks , т.е. основной блок.

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