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
两次时,它无法解决这个问题。 ( 不需要 Index
和 IndexMut
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);
我尝试执行以下代码,但它没有编译,因为“一个向量不能被借用为可变的,因为它也被借用为不可变的”。
问题是我看不出错误消息的相关性。我借用不可变数组 [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
两次时,它无法解决这个问题。 ( 不需要 Index
和 IndexMut
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);