Rust中泛型
可以提高代码的复用能力,多用于处理重复代码问题。
什么是泛型
泛型
是具体类型或其他属性的抽象代替,可以理解为占位符
,Rust在编译时,编译器会将占位符
替换为具体的类型。
fn largest<T>(list: &[T]) -> T {...}
说明:
T
缩写是 type
,代表参数类型,T
就是占位符,也可以使用其他的字母代替,如:E
- 不建议定义多个泛型参数,若多个泛型参数,可以拆分更多小的单元
- 通常泛型函数中,参数类型和返回类型
struct 中定义泛型
#[derive(Debug)]
//struct Point<T> {
struct Point<T, E> {
x: T,
//y: T,
y: E,
}
fn main() {
let a = Point{x:1, y:2};
println!("{:?}", a);
}
enum 中定义泛型
枚举的变体可以定义为泛型数据类型,示例:
enum Option<T> {
Some(T),
None,
}
enum Result<T, E> {
Ok(T),
Err(E),
}
方法中定义泛型
为 struct 或 enum 实现(impl)方法的时候,也可以在定义中使用泛型
#[derive(Debug)]
pub struct Point<T> {
// struct Point<T, E> {
x: T,
y: T,
//y: E,
}
impl<T> Point<T> {
pub fn x(&self) -> &T {
&self.x
}
}
impl Point<i32> {
pub fn y(&self) -> &i32 {
&self.y
}
}
fn main() {
let a = Point{x:1, y:2};
println!("{:?}, x: {}, y: {}", a, a.x, a.y);
}
说明:
impl<T> Point<T> {}
表示在类型 T 上实现方法impl Point<i32> {}
表示仅针对 i32 类型实现方法- struct 里的泛型类型参数可以和方法的泛型类型参数不同
其他
- 使用泛型的代码和使用具体类型的代码的运行速度是一样的
- 因为:Rust 在编译时通过
单态化(monomorphization)
,将泛型转化为具体类型