在for循环中推送Vec时,新成员如何坚持?

问题描述 投票:-2回答:1

我试图通过黑客攻击来学习如何利用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();
}
rust
1个回答
0
投票

代码的问题在于,当你创建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();
}

gentle introduction的例子更多,因为duck1duck2ducks在同一范围/块中,即主要块。

你可以阅读更多关于所有权和生命周期herehere

© www.soinside.com 2019 - 2024. All rights reserved.