创建一个以数字为泛型参数的通用类型

11

我正在使用 Rust 编写一个 N-Gram 库。我希望创建一个“通用”的 n-gram,其中大小在编译时确定(而不是在编码时确定)。一些代码可能会使这更加清晰。

这就是我想要做的:

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

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

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

那么您将创建一个五元组(或更准确地说,一个 Vec<[String; 5]>)。这样的事情是否可能?我真的不想做这样的事情:

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

那将大部分违背创建这种类型的目的。

2个回答

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

然而,通过编写宏,就像标准的vec!一样,可能有可能实现等效。 - trent
1
@trentcl 是的,我想这就是我必须要做的。我还发现了 https://github.com/rust-lang/rfcs/issues/1038,它似乎正是我所说的。希望有一天它能够被实现。 - wmaxlees
@dobafresh:这是非常需要的,与编译时函数评估密切相关(因为仅具有无法修改的原始数字并不那么有用)。 - Matthieu M.

4
将来可能会有这个功能,但在此之前,最好的方法是:
使用一个基础特征(base trait)来实现固定大小的数组,并使用宏为所需的所有大小实现。通过这个特征,您不需要更多的宏来实现其余的功能。
在正常使用中,我敢打赌您不必键入 let vec = Ngram::<[String; 5]>::new();,您只需要说:
let vec = Ngram::<[_; 5]>::new();

这样写略微好一些。如果您使用支持特性来约束数组元素类型为String,那么这种写法就不会有歧义。

有关更多信息,请参见crate arrayvec的代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接