为什么不编译:
fn main() {
let mut b = Box::new(Vec::new());
b.push(Vec::new());
b.get_mut(0).unwrap().push(1);
}
虽然这样做:
fn main() {
let a = Box::new(Vec::new());
let mut b = *a;
b.push(Vec::new());
b.get_mut(0).unwrap().push(1);
}
这也是:
fn main() {
let mut b = Vec::new();
b.push(Vec::new());
b.get_mut(0).unwrap().push(Vec::new());
b.get_mut(0).unwrap().get_mut(0).unwrap().push(1)
}
第一个和第三个对我来说概念上是相同的 - Box
Vec
Vec
整数和Vec
Vec
Vec
整数{{1}}转子的转子,但最后一个导致每个矢量都是可变的,而第一个使得内部矢量不可变。
答案 0 :(得分:3)
至少在Rust 1.25.0中,所有三个原始示例都有效。这是Rust之前版本中的一个错误。
答案 1 :(得分:0)
在将其作为可变对象访问之前,您需要取消装箱值:
fn main() {
let mut b = Box::new(Vec::new());
b.push(Vec::new());
(*b).get_mut(0).unwrap().push(1);
}
这是因为.
运算符使用Deref
特征而不是DerefMut
。
实现这一目标的最佳方法是:
fn main() {
let mut b = Box::new(Vec::new());
b.push(Vec::new());
b[0].push(1);
}