如何在Rust中交换向量、切片或数组中的项?

如何在Rust中交换向量、切片或数组中的项?,rust,Rust,我的代码如下所示: fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) { let temp = collection[a]; collection[a] = collection[b]; collection[b] = temp; } fn swap(&mut self, a: usize, b: usize) { unsafe { // Can't ta

我的代码如下所示:

fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) {
    let temp = collection[a];
    collection[a] = collection[b];
    collection[b] = temp;
}
fn swap(&mut self, a: usize, b: usize) {
    unsafe {
        // Can't take two mutable loans from one vector, so instead just cast
        // them to their raw pointers to do the swap
        let pa: *mut T = &mut self[a];
        let pb: *mut T = &mut self[b];
        ptr::swap(pa, pb);
    }
}
fn交换(mut集合:Vec,a:usize,b:usize){
设温度=集合[a];
集合[a]=集合[b];
集合[b]=温度;
}
Rust非常确定我不被允许“移出去引用”或“移出索引内容”,不管是什么。我如何让Rust相信这是可能的?

有一个问题。由于
Vec
可以作为
&mut[T]
,因此可以直接调用此方法:

fn main() {
    let mut numbers = vec![1, 2, 3];
    println!("before = {:?}", numbers);
    numbers.swap(0, 2);
    println!("after = {:?}", numbers);
}
要自己实现这一点,您必须编写一些不安全的代码。像这样:

fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) {
    let temp = collection[a];
    collection[a] = collection[b];
    collection[b] = temp;
}
fn swap(&mut self, a: usize, b: usize) {
    unsafe {
        // Can't take two mutable loans from one vector, so instead just cast
        // them to their raw pointers to do the swap
        let pa: *mut T = &mut self[a];
        let pb: *mut T = &mut self[b];
        ptr::swap(pa, pb);
    }
}
它从向量中获取两个原始指针,并使用它们安全地交换


当您需要交换两个不同的变量时,还存在一个错误。这不能在这里使用,因为Rust不允许从同一个向量获取两个可变借词。

正如@gsingh2011所提到的,公认的答案不再是好方法。在当前情况下,此代码工作正常:

fn main() {
    let mut numbers = vec![1, 2, 3];
    println!("before = {:?}", numbers);
    numbers.swap(0, 2);
    println!("after = {:?}", numbers);
}

我已经更新了另一个答案,因此这是多余的。