我对铁锈很陌生,开始掌握所有权制度等方面的窍门,但仍有一些问题。对于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
此外,请注意,我们不需要将更新后的值放回向量中,因为我们通过使用对向量的引用直接更改了向量中的值