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 解决方案来解决此类问题,那就太好了:)
预先感谢您花时间帮助我。
这会失败,因为索引操作尝试array同时可变和不可变地借用,这是不允许的。
然而,你甚至可以同时可变地借用一个值的不同部分(“分割借用”),但要做到这一点,Rust 必须知道它们是同一个值的一部分。当您索引两次时它无法弄清楚这一点array。(没有什么要求返回Index对IndexMut相同值的引用,也没有要求它们在调用两次时给出相同的索引时这样做,也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)
(游乐场)
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |