为什么我不能将盒装的矢量内容借用为可变的?

时间:2015-02-07 19:01:33

标签: vector rust

为什么不编译:

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}}转子的转子,但最后一个导致每个矢量都是可变的,而第一个使得内部矢量不可变。

2 个答案:

答案 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);
}
相关问题