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
//在Rust中使用泛型没有性能问题,编译时Rust会检查代码中所有用到泛型的地方,然后分析上下文将泛型替换为具体类型。
//也可以使用这样的方法来为struct指定泛型
struct Point<T>{
x:T,
y:T,
}
//泛型方法
//注意必须在impl关键字后边跟上<T>
impl<T> Point<T>{
fn get_x(&self)->&T{
return &self.x;
}
}
//为泛型为f32的Point实例定义方法,其他泛型不是f32的Point<T>实例则没有定义此方法
impl Point<f32>{
fn distance_from_origin(&self) -> f32{
let test = &self.x;
return (self.x.powi(2) + self.y.powi(2)).sqrt();
}
}
//枚举也可以在成员中存放泛型的成员数据,比如Option和Result
// enum Option<T>{
// Some(T),
// None,
// }
// enum Result<T,E>{
// Ok(T),
// Err(E)
// }
pub fn enter(){
// let integer = Point{
// x:5,
// y:10
// };
// let float_ = Point{
// x:1.0,
// y:4.0,
// };
// let number_list = vec![34,50,25,100,25];
// let result = largest(&number_list);
// println!("largest number is {}",result) ;
// let char_list = vec!['y','m','a','q'];
// let result = largest(&char_list);
// println!("largest char is {}",result);
}
//在Rust中使用泛型
//只要在方法名后跟T即可
//这里的代码是有问题的,无法通过编译,因为不知道T的类型是否可以进行比较
// fn largest<T>(list: &[T]) -> &T {
// let mut largest = &list[0];
// for item in list {
// if item > largest {
// largest = item;
// }
// }
// return largest
// }
//所以要把T的类型限定为实现了std::cmp::PartialOrd这个trait的
fn largest<T:std::cmp::PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
return largest
}