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

时间:2015-07-07 19:19:35

标签: generics rust

我正在Rust写一个NGram库。我想创建一个'泛型' ngram,在编译时间之前不需要确定大小(与我编码时相反)。一些小代码可能有助于说清楚。

这基本上是我希望能够做到的:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

对固定大小的数组使用基本特征,使用宏来实现所需的所有大小。使用该特征,您不需要更多的宏来完成剩余的功能。

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

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

略胜一筹。如果您使用支持特征将数组的元素类型约束为String,那么这篇文章永远不会含糊不清。

有关详细信息,请参阅crate arrayvec's code