Class Generics
1 2 3
| struct MyStruct<T> { value: T, }
|
Function Generics
1 2 3
| fn function<T>(a: T) { }
|
Method Generics
1 2 3 4
| impl<T> Point<T> { fn func<U>(&self, x: U) -> &T { } }
|
const Generics
1 2 3
| fn func<T, const N: usize>(arr: [T; N]) { }
|
const fn
相当于 constexpr 的功能,让编译器尝试在编译期就对表达式进行求值.
1 2 3 4 5 6 7 8
| const fn add(a: usize, b: usize) -> usize { a + b } const RESULT: usize = add(5, 10);
fn main() { println!("The result is: {}", RESULT); }
|
编译器对泛型类型作检查、concept
由于 Rust 是 Zero Cost Abstraction,所以编译期检查也是尤为重要的。效果上和 C20 Concept 和 SFINAE 更接近,本质上和 C20 Concept 更相似。C++20 concept 用 requires 对模板类型参数作出一定的限制,而 Rust 中可以使用 Assert<{ ... }>: IsTrue 对模板参数进行检查(类型参数和 const 泛型都可以)。
以下代码就在编译期检查函数类型的大小是否超过 768 字节。
1 2 3 4 5 6
| fn something<T>(a: T) where Assert<{ core::mem::size_of::<T>() < 768 }>: IsTrue, { }
|