Rust 入门 泛型
泛型
- 提高代码的复用能力
- 处理代码的重复问题
- 泛型是具体的数据类型或者其他属性的抽象代替
- 泛型就相当于数据类型的占位符
- 编译器在编译的时候就会替换泛型为具体的数据类型, 这个过程被称为单态化(monomorphization)
- 泛型参数名通常使用一个字母, 大多数情况下使用 T 表示, 因为字母 T 是单词 type 的缩写
- 泛型可以有多个, 声明多个泛型时使用半角逗号分隔
- 使用泛型时必须先声明泛型
fn largest<T> (list: &[T]) -> T {
}
fn main() {
// i32类型的数组
let arr = [10, 20, 15, 40];
// 此时泛型在编译时会被替换为 i32
let num = largest(&arr);
}
在函数中使用泛型
- 函数中的泛型类型通常是定义函数的参数类型和返回值类型
- 定义在方法签名中
// 不使用泛型
fn largest_1(list: &[i32]) -> i32 { }
// 使用一个泛型类型
fn largest_2<T>(list: &[T]) -> T { }
// 使用多个泛型类型
fn largest_3<T, E>(arg1: T, arg2: E) { }
// fn largest_2<T>(list: &[T]) -> T
// <T> 表示我们声明了一个泛型
// list: &[T] 表示参数`list`的数据类型是 泛型T的切片
// -> T 表示函数的返回值的类型是 T
在结构体中使用泛型
- 结构体中的泛型类型通常是定义字段的数据类型
- 定义在结构体标识符的后面
struct Point<T> {
x: T,
y: T,
}
struct Location<T, E> {
x: T,
y: E,
}
在枚举中使用泛型
- 枚举中的泛型类型可以让枚举的变体持有泛型数据类型
- 定义在枚举标识符的后面
enum Option<T> {
Some(T),
None,
}
enum Result<T, E> {
Ok(T),
Err(E),
}
在方法中使用泛型
- 为结构体或者枚举实现方法时, 可以使用泛型
struct Point<T> {
x: T,
y: T,
}
// 为结构体方法实现泛型参数
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
// 为方法添加独立的泛型参数
fn mix<E>(&self, value: T, oud: E) {
}
}
// 针对具体的类型为结构体实现方法
impl Point<i32> {
fn y(&self) -> &i32 {
&self.y
}
}
如果对我分享的内容感兴趣的话 记得关注我得动态
求推荐 求收藏 求转发 求关注
求推荐 求收藏 求转发 求关注