我的代码如下所示:

fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) {
    let temp = collection[a];
    collection[a] = collection[b];
    collection[b] = temp;
}

Rust非常确定我不被允许"移出go 引用"或"移出索引内容",不管是什么.我如何让Rust相信这是可能的?

推荐答案

有一个swap method defined for &mut [T].由于Vec<T>可以是mutably dereferenced,也可以是&mut [T],因此可以直接调用此方法:

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

要自己实现这一点,必须编写一些不安全的代码.Vec::swap is implemented个像这样:

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);
    }
}

它从向量中提取两个原始指针,并使用ptr::swap安全地交换它们.

当你需要交换两个不同的变量时,也有一个mem::swap(&mut T, &mut T).这在这里不能使用,因为Rust不允许从同一个向量获取两个可变的借词.

Rust相关问答推荐

交换引用时的生命周期

创建Rust中元对象协议的动态对象 Select /重新分配机制

在macro_rule中拆分模块和函数名

如何使用Actix Web for Rust高效地为大文件服务

什么时候使用FuturesOrdered?

确保参数是编译时定义的字符串文字

Rust 中指向自身的引用如何工作?

将多维数组转换为切片

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

分配给下划线模式时会发生什么?

Rust 引用元组和引用元组

是否可以在 Rust 中的特定字符上实现特征?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

没有通用参数的通用返回

用逗号分隔字符串,但在标记中使用逗号

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

为什么-x试图解析为文字并在声明性宏中失败?

如何从 many0 传播 Nom 失败上下文?

返回 &str 但不是 String 时,borrow 时间比预期长