我可以复制这个向量,但这需要时间和内存。我可以写另一个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;
^
rust中的生存期规则非常(非常)严格:如果您有对对象的引用,则该对象的生存期必须比引用长,在两个方向上都是。
这意味着引用必须在对象之后创建。
在您的情况下,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);
}