1、泛型是具体类型或者其它属性的抽象替代,用于减少代码重复。
2、在函数定义中使用泛型。
创建一个项目learn_T:
cargo new learn_T
修改src/main.rs文件:
// 没有泛型
// for 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);
println!("Hello, world!");
}
在以上例子中可以看到,不使用泛型,对于不同类型的vector求最大值,需要编写针对不同类型求解的函数,这需要写很多重复代码。而使用泛型,则会减少很多不必要的重复代码。
使用泛型的代码:
// 使用泛型
// <T: PartialOrd + Copy>约束泛型函数要实现按照顺序进行比较、拷贝特征
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
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_i32(&number_list);
let max_number = largest(&number_list);
println!("max_number = {}", max_number);
let char_list = vec!['a', 'y', 'b'];
//let max_char = largest_char(&char_list);
let max_char = largest(&char_list);
println!("max_char = {}", max_char);
println!("Hello, world!");
}
3、在结构体中使用泛型。
// 在结构体中使用泛型
#[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);
}
本节全部源代码:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_T/src/main.rs
来源:oschina
链接:https://my.oschina.net/u/943779/blog/4849118