我生锈很新,我开始掌握所有权制度等等,但我仍然有一些挂断。例如,我有以下代码:
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
错误。我知道为什么这种情况正在发生,我想,但我无法弄明白我应该做些什么而不是完成同样的事情。这是一个非常简化的案例,但任何帮助将不胜感激。谢谢!
答案 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
另外,请注意我们不需要将更新后的值放回向量中,因为我们通过使用对它的引用直接更改了向量中的值。