如何在Rust中交换多维数组中的值?

时间:2016-11-29 02:33:43

标签: arrays rust

使用定义为[[f64; 4]; 4]的矩阵(多维固定大小的数组),是否可以交换两个值?

std::mem::swap(&mut matrix[i][k], &mut matrix[k][l]);

给出错误:

error[E0499]: cannot borrow `matrix[..][..]` as mutable more than once at a time
   --> math_matrix.rs:100
    |
100 | std::mem::swap(&mut matrix[i][j], &mut matrix[k][l]);
    |                     ------------       ^^^^^^^^^^^^^^^- first borrow ends here
    |                     |                  |
    |                     |                  second mutable borrow occurs here
    |                     first mutable borrow occurs here

我能弄清楚如何实现这一点的唯一方法是使用临时值,例如:

macro_rules! swap_value {
    ($a_ref:expr, $b_ref:expr) => {
        {
            let t = *$a_ref;
            *$a_ref = *$b_ref;
            *$b_ref = t;
        }
    }
}

然后使用:

swap_value!(&mut matrix[i][k], &mut matrix[maxj][k]);

有更好的选择吗?

1 个答案:

答案 0 :(得分:2)

您需要使用split_at_mut拆分外层。这会创建两个不相交的可变引用,然后可以单独交换:

use std::mem;

fn main() {
    let mut matrix = [[42.0f64; 4]; 4];

    // instead of 
    // mem::swap(&mut matrix[0][1], &mut b[2][3]);

    let (x, y) = matrix.split_at_mut(2);
    mem::swap(&mut x[0][1], &mut y[0][3]);
    //                             ^-- Note that this value is now `0`!
}

在最常见的情况下,您可能需要添加一些代码来确定拆分位置和顺序。