求解一道rust所有权与借用关系的习题
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你这个有点矛盾啊,fill_vec 函数要求传入的参数是Vec<i32>,Vec类型是移动语义,当函数执行、vec0当作参数传入后,其所有权就转移到了返回值vec1里了。你也没法有两个变量同时持有Vec的可变借用和不可变借用,这种是rust里不允许的操作。按照目前的代码,如果你一定想在此时保留vec0,可以通过 fill_vec(vec0.clone()),将vec0复制一份当成参数传进去,当然这可能不是你写这段代码的本意。