我正在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)
这大多会破坏创建类型的目的.
将来这是可能的,但在那之前,最好的方法是:
对固定大小的数组使用基本特征,并使用宏来实现您需要的所有大小。有了这个特征,您不需要更多的宏来实现其余的功能。
在正常使用中,我敢打赌您不必输入let vec = Ngram::<[String; 5]>::new();,您只需说:
let vec = Ngram::<[_; 5]>::new();
Run Code Online (Sandbox Code Playgroud)
这稍微好一点。如果您使用支持特征将数组的元素类型限制为String,那么这种写法永远不会含糊不清。
请参阅板条箱 arrayvec 的代码以获取更多信息。