为什么我不能在内部引用内存"如果"?

时间:2015-04-16 09:47:56

标签: 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;
                       ^

1 个答案:

答案 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);
}