求解一道rust所有权与借用关系的习题

发布于 2022-09-12 03:05:04 字数 674 浏览 23 评论 0

fn main() {
    let vec0 = Vec::new();
    let mut vec1 = fill_vec(vec0);
    
    // Do not change the following line! 
    println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0);
    
    vec1.push(88);

    println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
}
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {                                                                       
    let mut vec = vec;

    vec.push(22);
    vec.push(44);
    vec.push(66);

    vec
}

如上, 怎样才能编译通过呢?
我知道将 let mut vec1 = fill_vec(vec0); 换到第一个 println! 之后可行, 但在不换的情况下, 是否可以通过编译?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怪我太投入 2022-09-19 03:05:04

你这个有点矛盾啊,fill_vec 函数要求传入的参数是Vec<i32>,Vec类型是移动语义,当函数执行、vec0当作参数传入后,其所有权就转移到了返回值vec1里了。你也没法有两个变量同时持有Vec的可变借用和不可变借用,这种是rust里不允许的操作。按照目前的代码,如果你一定想在此时保留vec0,可以通过 fill_vec(vec0.clone()),将vec0复制一份当成参数传进去,当然这可能不是你写这段代码的本意。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文