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

Why can't I make a reference to memory inside "if"?

我可以复制这个向量,但这需要时间和内存。 我可以写另一个 println,但这只是一个示例 — 可能有多个循环而不是 println — 它将占用 space 并使代码复杂化。我可以在 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);
}