24.泛型(Generic)

泛型是运行时指定数据类型的一种机制。好处是通过高度的抽象,使用一套代码应用多种数据类型。比如我们的向量,可以使用数值类型,也可以使用字符串类型。泛型是可以保证数据安全和类型安全的,还同时减少代码量。

Rust 语言中的泛型主要包含 泛型集合泛型结构体泛型函数范型枚举特质

Rust 使用使用 <T> 语法来实现泛型, 其中 T 可以是任意数据类型。

泛型集合

我们之前用过的向量。我们可以创建 i32 类型的,也可以创建字符串类型的,但是一旦确定了类型,就不能添加其他类型,否则报错。

1
2
let mut v:Vec<i32> =vec![1,2,3];
v.push("4");//此处会报错 ^^^ expected `i32`, found `&str`

说明向量需要的是 i32 类型的值,现在给了一个字符串。从这点看,泛型 让集合更通用,也更安全。

泛型结构体

定义语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct 结构体名称<T> {
元素:T,
}


struct Data<T> {
value:T,
}

fn main() {
let t:Data<i32> = Data{value:100};
println!("值:{} ",t.value);//输出 值:100
let t:Data<f64> = Data{value:66.00};
println!("值:{} ",t.value);//输出 值:66
}

特质 Trait

可以把这个特质(traits)对标其他语言的接口,都是对行为的抽象。使用 trait关键字用来定义。特质,可以包含具体的方法,也可以包含抽象的方法。

1
2
3
4
5
6
7
8
9
trait some_trait {
// 没有任何实现的虚方法
fn method1(&self);

// 有具体实现的普通方法
fn method2(&self){
//方法的具体代码
}
}

实现特质

Rust 使用 impl for 为每个结构体实现某个特质。implimplement 的缩写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct Book {
name: String,
id: u32,
author: String,
}

trait ShowBook {
fn Show(&self);
}

impl ShowBook for Book{
fn Show(&self) {
println!("Id:{},Name:{},Author:{}",self.id,self.name,self.author);
}
}

fn main() {
let book = Book{
id:1,
name: String::from("Go语言极简一本通"),
author: String::from("欢喜")
};
book.Show();//输出 Id:1,Name:Go语言极简一本通,Author:欢喜
}

泛型函数

主要是指参数是泛型类型,不要求所有参数都必须是泛型参数,可以是某一个参数是泛型类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fn 方法名<T[:特质名称]>(参数1:T, ...) {

// 函数实现代码
}


fn show2<T:Display>(t:T){
println!("{}",t);
}

impl Display for Book{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
println!("Id:{},Name:{},Author:{}",self.id,self.name,self.author);
let r=Result::Ok(());
return r;
}
}

show2(book);//输出 Id:1,Name:Go语言极简一本通,Author:欢喜

添加微信 公众号更多内容
wechat gzh