我可以制作这个载体的副本,但这需要时间和记忆。
我可以写另一个println
,但这只是一个例子 - 而不是println
可能有几个循环 - 它将占用空间并使代码复杂化。我可以在main
中执行转换并编写函数调用的两个版本,但更改引用要容易得多。
fn foo(mut a: &Vec<i32>) {
let mut c: Vec<i32>;
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}", a);
}
fn main() {
let a: Vec<i32> = vec![0; 3];
foo(&a);
}
错误:
main.rs:9:14: 9:15 error: `c` does not live long enough
main.rs:9 a = &c;
^
答案 0 :(得分:2)
生锈的生命规则非常严格:如果你有一个对象的引用,这个对象的寿命必须比参考的长,在两个方向。
这意味着必须在对象之后创建引用。
在您的情况下,a
之前存在c
,因此作业a = &c
无效。一个简单的修复可以是在创建c
之后创建引用的副本并处理此副本:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let mut a = vec_ref
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}",a);
}
或以更生疏的方式:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let a = if vec_ref[0] == 0 {
c = vec![1; 3];
&c
} else {
vec_ref
};
println!("{:?}",a);
}