#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
, т.е. основной блок.
Вы можете прочитать больше о владении и сроках службы здесь и здесь