Rust 如何切换向量的两个部分而不产生冲突的借用?

Rust 如何切换向量的两个部分而不产生冲突的借用?,rust,borrow-checker,Rust,Borrow Checker,我将在一个Vec中切换元素,但我的解决方案有所有权问题,我的代码完全错了吗 给定[1,2,3,4,5,6],预期输出为[4,5,6,1,2,3] fn开关(nums:&mut-Vec,k:i32){ 设t=k为usize; 设v1=&nums[…t]; 排水量(t…); nums.从_切片(v1)延伸_; } error[E0502]:无法将“*nums”作为可变项借用,因为它也是作为不可变项借用的 -->src/main.rs:7:5 | 6 |设v1=&nums[…t]; |----此处发

我将在一个Vec中切换元素,但我的解决方案有所有权问题,我的代码完全错了吗

给定
[1,2,3,4,5,6]
,预期输出为
[4,5,6,1,2,3]

fn开关(nums:&mut-Vec,k:i32){
设t=k为usize;
设v1=&nums[…t];
排水量(t…);
nums.从_切片(v1)延伸_;
}
error[E0502]:无法将“*nums”作为可变项借用,因为它也是作为不可变项借用的
-->src/main.rs:7:5
|
6 |设v1=&nums[…t];
|----此处发生不可变借用
7 | nums.从_切片延伸_(v1);
|     ^^^^^-----------------^^^^
|     |    |
||不可变借阅稍后由调用使用
|可变借用发生在这里
使用或,其中
mid
是向量的中间。这将有效地执行预期的切换

let x = vec![1, 2, 3, 4, 5, 6];
let mid = x.len() / 2;
使用
向左旋转

x.rotate_left(mid);
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);
使用
向右旋转

x.rotate_right(mid);
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);
同样的方法也适用于普通可变切片。如果要交换的两个分区大小相同但不连续,可以创建两个可变元素的迭代器并交换它们,或者使用

。。。或者逐个交换每个元素

let (left, right) = x.split_at_mut(mid);
for (l, r) in Iterator::zip(left.iter_mut(), right.iter_mut()) {
    std::mem::swap(l, r);
}
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);
另见:


非常相关:而且,即使没有借阅检查器的干预,该算法也无法按预期工作。当
k
不是中间位置时,您期望的行为是什么?谢谢大家,我是新手,对所有权不太了解,你们帮了我大忙!
let (left, right) = x.split_at_mut(mid);
for (l, r) in Iterator::zip(left.iter_mut(), right.iter_mut()) {
    std::mem::swap(l, r);
}
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);