1. ホーム
  2. arrays

[解決済み] Rustでスライスを配列として取得するには?

2023-04-02 12:19:27

質問

サイズ不明の配列があり、その配列のスライスを取得して静的サイズの配列に変換したいのですが、どうすればよいでしょうか。

fn pop(barry: &[u8]) -> [u8; 3] {
    barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}

どうすればいいのでしょうか?

どのように解決するのですか?

これを簡単に行うには TryInto trait (Rust 1.34 で安定化しました) を使えば簡単にできます。

use std::convert::TryInto;

fn pop(barry: &[u8]) -> [u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

しかし、さらに良いことに、要素をクローン/コピーする必要がないのです! それは実際に &[u8; 3] から &[u8] :

fn pop(barry: &[u8]) -> &[u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

他の回答にもあるように、おそらくは barry の長さが3でない場合にパニックを起こすのではなく、このエラーを優雅に処理したいのでしょう。

これは関連するtraitのこれらのインプラントのおかげで動作します。 TryFrom (Rust 1.47 以前では、これらは長さ 32 までの配列に対してのみ存在していました)。

impl<'_, T, const N: usize> TryFrom<&'_ [T]> for [T; N]
where
    T: Copy, 

impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]

impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]