22511


最近Rustを学び始めて，現在以下のようなコードを書いています．

[code]

    static TABLE:[[u8; 4]; 4] =[
        [ 3,  6,  7, 14],
        [ 1, 11, 13,  5],
        [ 8,  2,  4,  9],
        [10, 15,  0, 12]
    ];
    
    fn main() {
        let mut input: [[u8; 2]; 4] = [[4, 8], [3, 10], [9, 1], [0, 3]];
        let output = func(input, TABLE);
        for row in output.iter() {
            for data in row.iter() {
                println!("{}", data);
            }
        }
    }
    
    fn func(input:[[u8; 2]; 4], table:[[u8; 4]; 4]) -> [[u8; 2]; 4] {
        let mut t = input.clone();
        for i in t.iter() {
            for j in i.iter() {
                let y = j % 4;
                let x = (j - y) / 4;
                j = table[x as usize][y as usize].clone();
            }
        }
    
        t;
    }
    
[/code]

funcは，二次元配列inputの要素の値(Z)から二次元配列tableの座標(X, Y)を算出して，Zをその値に書き換えた配列を新たに返すという関数です．

これをコンパイルしようとすると以下のエラーでコンパイルに失敗します．

> src/main.rs:24:17: 24:54 error: mismatched types:  
>  expected `&u8`, found `u8`  
>  (expected &-ptr, found u8) [E0308]  
>  src/main.rs:24 j = **table[x as usize][y as usize].clone();**

j は t[〜][〜] の値の参照で，それを書き換えることによって t
にそれが反映されることを期待していたのですが，そのやり方が間違っているようで悩んでいます．

ちなみに以下のような出力を期待しています．

[code]

    1
    8
    14
    4
    2
    6
    3
    14
    
[/code]

どのようにすればこのような出力を得られるでしょうか？


CC BY-SA 3.0
2016-02-24T15:38:34.423
22490
2016-02-25T08:05:26.097
12467
question
rust
Rustの型エラーで二次元配列が書き換えられない


.iter()はimmutableなreferenceを返すので書き換えれません．.iter_mut()を使って以下のようにすると所望の出力が得られました．

[code]

    fn func(input:[[u8; 2]; 4], table:[[u8; 4]; 4]) -> [[u8; 2]; 4] {
        let mut t = input.clone();
        for i in t.iter_mut() {
            for j in i.iter_mut() {
                let y = *j % 4;
                let x = (*j - y) / 4;
                *j = table[x as usize][y as usize].clone();
            }
        }
        return t;
    }
    
[/code]


CC BY-SA 3.0
2016-02-25T06:07:17.830
22511
2016-02-25T08:05:26.097
2016-02-25T08:05:26.097
14418
14418
22490
answer