rust:不能移出索引上下文



我对铁锈很陌生,开始掌握所有权制度等方面的窍门,但仍有一些问题。对于exmaple,我有以下代码:

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]);
}

这给了我初始化o的行的cannot move out of indexed content错误。我想,我理解为什么会发生这种情况,但我不知道我应该做什么来完成同样的事情。这是一个非常简单的案例,但任何帮助都将不胜感激。谢谢

根据上下文,表达式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

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

最新更新