【问题标题】:How can I swap items in a vector, slice, or array in Rust?如何在 Rust 中交换向量、切片或数组中的项目?
【发布时间】:2016-12-21 22:50:34
【问题描述】:

我的代码如下所示:

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

Rust 很确定我不允许“移出取消引用”或“移出索引内容”,不管是什么。我如何让 Rust 相信这是可能的?

【问题讨论】:

    标签: rust


    【解决方案1】:

    有一个swap method defined for &amp;mut [T]。由于Vec&lt;T&gt;可以将mutably dereferenced作为&amp;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(&amp;mut T, &amp;mut T)。这不能在这里使用,因为 Rust 不允许从同一个向量中获取两个可变借用。

    【讨论】:

      【解决方案2】:

      正如@gsingh2011 所述,接受的答案不再是好方法。使用当前的 Rust,这段代码可以正常工作:

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

      try it here

      【讨论】:

      • 我已经更新了另一个答案,所以现在这是多余的。
      猜你喜欢
      • 2014-05-30
      • 2015-08-06
      • 2015-04-02
      • 1970-01-01
      • 2014-10-15
      • 2022-01-14
      • 2014-12-19
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多