Rust 问题:当元组位于向量内部时,无法可变和不可变地借用元组的部分内容

ros*_*v52 1 rust borrow-checker

我尝试执行以下代码,但它无法编译,因为“向量不能作为可变借用,因为它也作为不可变借用”。

问题是我不明白错误消息是如何相关的。我借用了不可变的 array[1].1 和可变的 array[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);
}
Run Code Online (Sandbox Code Playgroud)

我很困惑:为什么我可以可变且不可变地借用单个元组的部分,但当元组位于向量内部时却不能这样做。它与 Rustonomicon 中描述的分割借用有关吗?

最后,最重要的是:有没有办法修复此代码而不将元组向量分成 2 个向量?

虽然对最后一个问题的快速回答对我来说已经足够了,但我希望得到更多的解释并回答我的其他问题。如果您有一个更惯用的 Rust 解决方案来解决此类问题,那就太好了:)

预先感谢您花时间帮助我。

cdh*_*wie 5

这会失败,因为索引操作尝试array同时可变和不可变地借用,这是不允许的。

然而,你甚至可以同时可变地借用一个值的不同部分(“分割借用”),但要做到这一点,Rust 必须知道它们是同一个值的一部分。当您索引两次时它无法弄清楚这一点array。(没有什么要求返回IndexIndexMut相同值的引用,也没有要求它们在调用两次时给出相同的索引时这样做,也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);
Run Code Online (Sandbox Code Playgroud)

游乐场