创建由数字参数化的泛型类型

wma*_*ees 10 generics rust

我正在Rust写一个NGram库.我想创建一个'通用'ngram,其中大小不需要在编译时确定(与我编码时相反).一些小代码可能有助于说清楚.

这基本上是我想要做的:

pub type Ngram<N> = Vec<[String; N]>;
Run Code Online (Sandbox Code Playgroud)

然后使用它,你只需要做这样的事情:

let vec = Ngram::<5>::new();
Run Code Online (Sandbox Code Playgroud)

你会创造一个5克(或更准确地说,a Vec<[String; 5]>).这样的事情是可能的.我真的不想做这样的事情:

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

这大多会破坏创建类型的目的.

A.B*_*.B. 6

这在Rust 1.0中是不可能的.数组的大小不能是通用的.


blu*_*uss 4

将来这是可能的,但在那之前,最好的方法是:

对固定大小的数组使用基本特征,并使用宏来实现您需要的所有大小。有了这个特征,您不需要更多的宏来实现其余的功能。

在正常使用中,我敢打赌您不必输入let vec = Ngram::<[String; 5]>::new();,您只需说:

let vec = Ngram::<[_; 5]>::new();
Run Code Online (Sandbox Code Playgroud)

这稍微好一点。如果您使用支持特征将数组的元素类型限制为String,那么这种写法永远不会含糊不清。

请参阅板条箱 arrayvec 的代码以获取更多信息。