自 const 泛型的初始 RFC 被接受后,经过3年多的时间,const 泛型的第一个版本已经在 Rust 测试版上线了。Const 泛型是 Rust 即将推出的最令人期待的功能之一,将在 1.51 版本中推出,预计于 2021 年 3 月 25 日发布。
Const generics 是指范围为常量值的通用参数,而不是类型或生命周期。事实上,在 Rust 开发的早期,就已经有一个 const 泛型的例子:数组类型 [T;N],对于一些类型 T 和 N:usize。然而,以前没有办法对任意大小的数组进行抽象:如果你想为任意大小的数组实现一个特质,你就必须为每个可能的值手动实现。由于这个问题,在很长一段时间里,即使是数组的标准库方法也被限制为长度最多为 32。下面是一个 const 泛型示例。
struct ArrayPair<T, const N: usize> {
left: [T; N],
right: [T; N],
}
impl<T: Debug, const N: usize> Debug for ArrayPair<T, N> {
// ...
}
不过,由于通用 const 泛型的额外复杂性,此次的 const 泛型是 MVP( minimal viable product ,最小可行产品)版本,只有整数类型能用于 const 泛型(即有符号和无符号整数,包括 isize、usize、char 和 bool)。这支持对数组进行抽象。未来会允许更复杂的类型,如 &str 和用户定义类型。另外,const 参数不能使用复杂的通用表达式,仅能由以下形式的 const 参数实例化:
- 一个独立的 const 参数
- 一个文字(即一个整数、布尔或字符)
- 一个具体的 const 表达式(用 { } 括起来),不涉及通用参数
fn foo<const N: usize>() {}
fn bar<T, const M: usize>() {
foo::<M>(); // ok: `M` is a const parameter
foo::<2021>(); // ok: `2021` is a literal
foo::<{20 * 100 + 20 * 10 + 1}>(); // ok: const expression contains no generic parameters
foo::<{ M + 1 }>(); // error: const expression contains the generic parameter `M`
foo::<{ std::mem::size_of::<T>() }>(); // error: const expression contains the generic parameter `T`
let _: [u8; M]; // ok: `M` is a const parameter
let _: [u8; std::mem::size_of::<T>()]; // error: const expression contains the generic parameter `T`
}
除了上面描述的语言变化之外,Rust 还开始在标准库中添加利用 const 泛型的方法,比如 array::IntoIter 允许数组按值而不是按引用进行迭代。接下来,Rust 将继续优化 const 泛型,包括其默认参数问题、支持自定义类型和支持复杂表达式等等。
猜你喜欢:暂无回复。