Rust 中的 const generics
一、含义
常量泛型:使用常量值来当作泛型参数(ie. 100、a),而不是使用类型(ie. i32、char)
二、使用场景
在大多数需要使用数组类型却不知道其大小,Rust中的数组类型为 [T; N](T为元素的类型,N为大小),在编译期间就需要指定数组的大小,如果一个函数的参数类型为数组,没有常量泛型,就需要给同类型而大小不一的数组设置不同的参数
三、当前限制
- 整型、
char、bool(浮点型、自定义类型不行) - 只能单独使用泛型常量参数
- 常量表达式,用
{}包裹,不能有泛型参数
// 常量表达式需要指定类型
fn foo<const N: usize>() {}
fn bar<T, const M: usize>(array: [T; M]) {
foo::<M>(); // ok: `M` 是单独一个泛型常量参数
foo::<2021>(); // ok: `2021` 是一个常量
foo::<{20 * 100 + 20 * 10 + 1}>(); // ok: 可以在编译期间计算的常量表达式,而且没有泛型参数
foo::<{ M + 1 }>(); // error: 不是单独一个常量参数 `M`
foo::<{ std::mem::size_of::<T>() }>(); // error: 常量表达式包含泛型参数 `T`
let _: [u8; M]; // ok: `M` 是一个常量参数
let _: [u8; std::mem::size_of::<T>()]; // error: 常量表达式包含泛型参数 `T`
}
fn main(){
let arr1 = [0; 50];
let arr2 = ['a'; 10];
// 使用常量泛型函数
bar(arr1);
bar(arr2);
}
参考内容

浙公网安备 33010602011771号