在for循环中推送到Vec时,新成员如何保留?

时间:2019-04-02 21:14:59

标签: rust

我正在尝试通过破解来学习如何在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 :(得分:0)

您的代码存在的问题是,当您创建duck时,它位于for循环块内,导致只要for循环存在,它就一直存在,要解决此问题,您需要 transfer 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();
}

Codex's Reserved Terms中的示例更有效,因为duck1duck2ducks在同一个作用域/块中,即主块。

您可以详细了解所有权和生存期gentle introductionhere