Vecを変換する良い方法はありますか? 配列に?質問する

Vecを変換する良い方法はありますか? 配列に?質問する

Vec<T>サイズの をS型の配列に変換する良い方法はありますか[T; S]? 具体的には、長さが常に 16 になる 128 ビットのハッシュを として返す関数を使用しておりVec<u8>、そのハッシュを として処理したいと考えています[u8, 16]

私が望むものを提供するメソッドに似た組み込みのものはありますかas_slice、それとも固定サイズの配列を割り当て、ベクトルを反復処理して各要素をコピーし、配列を返す独自の関数を作成する必要がありますか?

ベストアンサー1

配列は完全に初期化する必要があるため、要素が多すぎるか少なすぎるベクトルを配列に変換するときに何をすべきかという問題にすぐに直面します。これらの例では、単にパニックに陥ります。

現在ラスト 1.51配列の長さをパラメータ化できます。

use std::convert::TryInto;

fn demo<T, const N: usize>(v: Vec<T>) -> [T; N] {
    v.try_into()
        .unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", N, v.len()))
}

現在ラスト 1.48それぞれのサイズは特殊な実装である必要があります。

use std::convert::TryInto;

fn demo<T>(v: Vec<T>) -> [T; 4] {
    v.try_into()
        .unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", 4, v.len()))
}

Rust 1.43 時点:

use std::convert::TryInto;

fn demo<T>(v: Vec<T>) -> [T; 4] {
    let boxed_slice = v.into_boxed_slice();
    let boxed_array: Box<[T; 4]> = match boxed_slice.try_into() {
        Ok(ba) => ba,
        Err(o) => panic!("Expected a Vec of length {} but it was {}", 4, o.len()),
    };
    *boxed_array
}

参照:

おすすめ記事