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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#[derive(Debug)]
//1.trait-bound
//2.指定多个trait trait-bound
//3.返回 trait的类型
fn print_information(item: impl GetInformation) {
//这里只关心是否实现impl trait,然后调用item实现的方法即可
println!("name = {}",item.get_name());
println!("age = {}",item.get_age());
}
//4. 使用trait bound语法糖将函数参数使用trait简化
fn print_information<T: GetInfromation>(item: T) {
//这里只关心是否实现impl trait,然后调用item实现的方法即可
println!("name = {}",item.get_name());
println!("age = {}",item.get_age());
}
trait GetName {
fn get_name(&self) -> &String;
}
trait GetAge {
fn get_age(&self) -> u32;
}
//5.trait bound,多个trait使用
//5.1 第一种写法
fn print_information<T: GetName+Get>(item: T) { //对T实现这两个trait
println!("name = {}",item.get_name());
println!("age = {}",item.get_age());

}
//5.2 第二种写法
//fn print_information<T>(item: T)
// where T: GetName+GetAge
//{ //对T实现这两个trait
// println!("name = {}",item.get_name());
// println!("age = {}",item.get_age());
// }

pub struct Student {
pub name: String,
pub age: u32,
}
pub struct Teacher {
pub name: String,
pub age: u32,
}
impl GetName for Student {
fn get_name(&self) -> &String {
&self.name
}
}
impl GetName for Teacher {
fn get_name(&self) -> &String {
&self.name
}
}

impl GetAge for Student {
fn get_age(&self) -> &String {
&self.age
}
}
impl GetAge for Teacher {
fn get_age(&self) -> &String {
&self.age
}
}

//6. trait类型作为返回
fn produce_item_with_age() -> impl GetAge { //返回的东西实现了这个triat,返回必须是
//一个具体的类型,if和else中的不是同一个类型
//错误用法
// let is = true;
// if is {
// Student {
// name: String::from("xiaoming"),
// age: 15,
// }
// }else {
// Teacher {
// name: String::from("xiaohu"),
// age: 21,
// }
// }
Student {
name: String::from("xiaoming"),
age: 15,

}
}
fn main() {
let s = Student {name: "xiaoming".to_string(),age: 10};
print_information(s);
let s = produce_item_with_age();

}
  • trait来简化largest函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fn largest<T: PartialOrd + Copy> (list: &[T]) -> T { //这里相当于泛型需要满足的条件

//第二种写法
//fn largest<T> (list: &[T]) -> T {
// where T:PartialOrd+ Copy

//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);
}