2016-05-05 16 views
3

arrは変更可能ですので、arrの長さはlen()を呼び出して取得できません。私はここにこだわっている、それを行う正しい方法は何ですか?配列の最後の項目を変更する方法は?

fn double_last(arr: &mut[i32]) -> &i32 { 
    let last = &mut arr[arr.len() - 1]; // borrow checker error. 
    //let last = &mut arr[3];   // fine 
    *last *= 2; 
    last 
} 

fn main() { 
    let mut a = [1,2,3,4]; 
    println!("{}", double_last(&mut a)); 
    println!("{:?}", a); 
} 

答えて

2

これは、非語彙的な生涯の導入と今後の変更がすぐに解決されるようになりました(解決できるようです)。今の

しかし、あなたはその計算を分割することにより、ボローチェッカーを満たすことができます。

let n = arr.len() - 1; 
let last = &mut arr[n]; 
+0

を使用することができ、それが動作のためのおかげで説明! – limon

4

あなただけの最後が必要な場合は、std::slice::last_mut

fn double_last(arr: &mut[i32]) -> &i32 { 
    let last = arr.last_mut().unwrap(); 
    *last *= 2; 
    last 
} 
+0

はい、ずっときれいです。それは空の配列の場合に返される型がOptionであるべきであることを私に思い出させます、ありがとう。 – limon

+0

@limonはい、配列が空でないことを保証できない場合、またはこの関数がpublicであることを保証できない場合、それらがどのように使用されるかを制御する側では、 'Option'が良い選択です。 – WiSaGaN

関連する問題