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

6
使用一个被定义为 [[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个回答

3

您需要使用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`!
}

在最普遍的情况下,您可能需要添加一些代码来确定在哪里分割以及以哪种顺序进行。


3
值得强调的是,在拆分后,外层使用0来表示y的索引。这是一个容易犯错的地方。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接