没有泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//1.泛型是具体类型或者其他属性的抽象替代,用于减少代码重复
//2.在函数定义中使用泛型
//3.在结构体中使用泛型
//4.枚举中的泛型
//5.方法中的泛型
//6.总结:使用泛型并不会造成程序性能上的损失,rust通过编译时进行泛型代码的单态化
//来保证效率,单态化时通过填充编译时使用到具体类型,将通用代码转化为特定代码

//没有泛型的时候
//for i32
//使用slice: i32类型
fn largest_i32(list: &[i32]) -> i32 {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}

//for char
fn largest_char(list: &[char]) ->char {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}

fn main() {
let number_list = vec![1,2,23,34,8,100];
let max_number = largest_i32(&number_list);
println!("max_number = {}",max_number);

let char_list = vec!['a','y','b'];
let max_char = largest_char(&char_list);
println!("max_char = {}",max_char);
}

函数使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fn largest<T: PartialOrd + Copy> (list: &[T]) -> T { //这里相当于泛型需要满足的条件
//PartialOrd是需要进行数据比较的特征
let mut larger = list[0];
for &item in list.iter() {
if item > larger {
larger = item;
}
}
larger
}
fn main() {
let number_list = vec![1,2,23,34,8,100];
let max_number = largest(&number_list);
println!("max_number = {}",max_number);

let char_list = vec!['a','y','b'];
let max_char = largest(&char_list);
println!("max_char = {}",max_char);
}

结构体中使用泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
#[derive(Debug)]
struct Point<T> {
x: T,
y: T,
}

fn main() {
let integer = Point{x:1,y:2};
println!("{:#?}",integer);

let float = Point{x:1.1 ,y: 2.2};
println!("{:?}",float);
}