为什么我不能在"if"中引用内存?

  • 本文关键字:if 内存 引用 不能 rust
  • 更新时间 :
  • 英文 :


我可以复制这个向量,但这需要时间和内存。我可以写另一个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);
}

最新更新