2016-11-29 36 views
3

[[f64; 4]; 4]と定義されている行列(多次元固定サイズ配列)を使用すると、2つの値を入れ替えることはできますか? Rustの多次元配列から値を入れ替えるには?

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

はエラーを与える:次に使用

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

:私はこれを実現する方法を見つけ出すことができる唯一の方法は、一時値、例えばを使用していた


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 

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

もっと良い選択肢はありますか?

答えて

2

split_at_mutを使用して外側のレイヤーを分割する必要があります。これはその後、個別に交換することができる2つの互いに素可変の参照を作成:最も一般的なケースでは

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`! 
} 

を、あなたはおそらく分割しているために、場所を把握するためにいくつかのコードを追加する必要があります。

+1

外層が分割後に「y」で0でインデックス付けされていることを強調します。作るのは簡単な誤りです。 –

関連する問題