Создать общий тип, параметризованный числом

Я пишу библиотеку NGram в Rust. Я хочу создать "общую" ngram, где размер не нужно определять до момента компиляции (в отличие от того, когда я его кодирую). Небольшой код может помочь сделать это понятным.

Вот в основном то, что я хочу сделать:

pub type Ngram<N> = Vec<[String; N]>;

а затем, чтобы использовать его, вы просто делаете что-то вроде этого:

let vec = Ngram::<5>::new();

И вы бы создали пять грамм (или, точнее, a Vec<[String; 5]>). Это возможно. Я действительно не хочу делать что-то вроде этого:

 pub type Ngram<N> = Vec<N>;
 ...
 let vec = Ngram::<[String; 5]>::new();

Это в основном победит цель создания типа.

Ответ 1

Это возможно в будущем, но до тех пор лучший способ сделать это:

Используйте базовый признак для массива фиксированного размера, реализуйте его с помощью макросов для всех требуемых размеров. С признаком, вам не нужно больше макросов для остальных функций.

При нормальном использовании я уверен, что вам не нужно набирать let vec = Ngram::<[String; 5]>::new();, вы можете просто сказать:

let vec = Ngram::<[_; 5]>::new();

что немного лучше. Если вы используете свой вспомогательный признак, чтобы ограничить тип элемента массива String, это письмо никогда не бывает двусмысленным.

Для получения дополнительной информации см. crate arrayvec code.

Ответ 2

Это невозможно в Rust 1.0. Размер массива не может быть общим.