2016-07-20 3 views
1

私は、ダイナミックな境界を持つ配列をスライスしようとしている:どのようにi32の制限でアレイをスライスするのですか?

fn main() { 
    let n: i32 = 2; 
    let a = [1, 2, 3]; 
    println!("{:?}", &a[0..n]); 
} 

それは私に次のエラーを与える:

error: the trait bound [_]: std::ops::Index<std::ops::Range<i32>> is not satisfied

私はこのエラーをどうするのか分かりません。アレイをスライスするのにi32を使用することはできないようですか?

答えて

7

あなたはslice docsIndex<Rangeを検索)Index形質が唯一usize範囲のために実装されていることで確認することができますので、あなたはRange<i32>を使用することはできません。

fn main() { 
    let n: i32 = 2; 
    let a = [1,2,3]; 
    println!("{:?}", &a[0..n as usize]); 
} 

が、キャストがチェックされていないので、あなたが世話をする必要があり、負のi32値がエラーなしでusizeにキャストすることができます。

一つの可能​​性は、usizeためi32をキャストすることです。チェックされた変換を行う関数を作成するか、クレートを使用することができます(たとえば、num::ToPrimitive)。

今後、標準ライブラリにRustはchecked conversionとなります。

+1

本当に正しい答えは、できるだけ早く 'usize'として' n'を試して保存することです。それが何らかのユーザ入力であれば、負の数値はインデックス作成に無効なので、それは 'usize'として解析されるべきです。 –

関連する問題