我正在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();
这大多会破坏创建类型的目的。
答案 0 :(得分:6)
这在Rust 1.0中是不可能的。数组的大小不能是通用的。
答案 1 :(得分:4)
将来有可能,但在那之前,最好的方法是:
对固定大小的数组使用基本特征,使用宏来实现所需的所有大小。使用该特征,您不需要更多的宏来完成剩余的功能。
在正常使用中,我打赌你不必输入let vec = Ngram::<[String; 5]>::new();
,你可以说:
let vec = Ngram::<[_; 5]>::new();
略胜一筹。如果您使用支持特征将数组的元素类型约束为String
,那么这篇文章永远不会含糊不清。
有关详细信息,请参阅crate arrayvec's code。