生锈:无法摆脱索引的背景

时间:2016-06-12 20:42:30

标签: rust

我生锈很新,我开始掌握所有权制度等等,但我仍然有一些挂断。例如,我有以下代码:

fn main() {
    let mut t = vec![Box::new(4)];
    let mut o = t[0];
    *o = *o + 1;
    t[0] = o;
    println!("t[0]:{}", t[0]);
}

这使我在初始化cannot move out of indexed content的行中出现o错误。我知道为什么这种情况正在发生,我想,但我无法弄明白我应该做些什么而不是完成同样的事情。这是一个非常简化的案例,但任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:5)

根据上下文,表达式t[0]相当于*t.index(0)*t.index_mut(0)。这些方法分别返回不可变引用和可变引用。索引操作符会自动解除引用。

由于您的向量为Box<i32>,因此解除引用无效,因为这会尝试从向量中移动值。但是,你在矢量中放置了什么呢?

您需要使用对值的引用,而不是尝试移动值。此外,如果您希望能够为值添加1,则需要引用该值,而不是对Box的引用。您可以通过首先取消引用该框,然后对结果进行可变引用来执行此操作:

fn main() {
    let mut t = vec![Box::new(4)];
    {
        let o = &mut *t[0];
        *o = *o + 1;
    }
    println!("t[0]:{}", &t[0]);
}

我必须在这里添加一个块来使println!之前的可变借位结束,否则编译器抱怨:

error: cannot borrow `t` as immutable because it is also borrowed as mutable

另外,请注意我们不需要将更新后的值放回向量中,因为我们通过使用对它的引用直接更改了向量中的值。