Rust 问题:当元组在向量中时,不能可变地和不可变地借用部分元组

Rust question : Cannot borrow parts of tuple mutably and immutably when tuple is inside a vector

我尝试执行以下代码,但它没有编译,因为“一个向量不能被借用为可变的,因为它也被借用为不可变的”。

问题是我看不出错误消息的相关性。我借用不可变数组 [1].1 和不重叠的可变数组 [1].0。

借用检查器是否足够聪明,可以看到没有冲突并且访问了元组的非重叠部分?

fn main() {
  //everything is ok when tuple is alone
  let mut pair : (usize, Vec<usize>) = (0, Vec::new());
  println!("{} {:?}", &pair.0, &mut pair.1);

  let mut array : Vec<(usize, Vec<usize>)> 
      = vec![(1, Vec::new()), (2, Vec::new())];
  //everything works till here
  // but the rest doesn't...
  println!("{} {:?}", &array[1].0, &mut array[1].1);
}

我很困惑:为什么我可以可变和不可变地借用单个元组的部分,但是当元组在向量中时不能这样做。 是否与 Rustonomicon 中描述的拆分借用有关?

最后,最重要的一点:有没有办法在不将元组向量分成 2 个向量的情况下修复此代码?

虽然对最后一个问题的快速回答对我来说已经足够了,但我希望能有更多的解释以及对我的其他问题的回答。如果您有针对此类问题的更惯用的 Rust 解决方案,那也很棒 :)

提前感谢您花时间帮助我。

这失败了,因为索引操作试图同时以可变和不可变方式借用 array,这是不允许的。

但是,您甚至可以同时可变地借用一个值的不同部分(“splitting borrow”),但要做到这一点,Rust 必须知道它们是同一个值的一部分。当您索引 array 两次时,它无法解决这个问题。 ( 不需要 IndexIndexMut return 对相同值的引用,也没有要求它们在调用两次时给定相同的索引,也不是 IndexMut 不会修改任何状态。)

您可以借一次特定的物品,然后再借一部分来完成:

// Borrow mutably from the array once.
let item1 = &mut array[1];

// Reborrow different parts of the item, splitting the mutable borrow above
// into two borrows.
println!("{} {:?}", &item1.0, &mut item1.1);

(Playground)