泛型(Generic Data Types)
在函数定义中使用泛型
<T>
: 使用尖括号声明, 表明 T 是泛型类型, 需要使用尖括号先声明, 你不先声明, rust 都不知道 T 是什么东西list: &[T]
: 表示形参 list 的类型为&[T]
, 也就是调用函数时接收的实参需要是一个切片,切片中的元素类型是T
&T
: 函数返回一个对类型为T
的引用
rs
// list是切片(slice)的引用, 不是数组, 数组使用 `list: &[T; N]`
fn largest<T>(list: &[T]) -> &T
where
T: PartialOrd,
{
let mut max_value = &list[0];
for item in list {
if item > max_value {
max_value = item;
}
}
max_value
}
在方法定义中使用泛型
rs
#[derive(Debug)]
struct Point<G1, G2> {
x: G1,
y: G2,
}
impl<X1, X2> Point<X1, X2> {
fn get_x(&self) -> &X1 {
// &((*self).x)
&self.x
}
fn mixup<T1, T2>(self, other: Point<T1, T2>) -> Point<X1, T2> {
Point {
x: self.x, // move
y: other.y, // move
}
}
}
// 为具体的泛型类型实现方法
impl Point<i32, i32> {
fn distance_from_origin(&self) -> i32 {
self.x + self.y
}
}
fn main() {
let p1 = Point { x: "hello", y: 123 };
println!("p.x : {}", p1.get_x());
let p2 = Point { x: 456, y: "wrold" };
println!("p2.x : {}", p2.get_x());
println!("p2.y : {}", p2.y);
let p3 = p1.mixup(p2);
// println!("p2.y : {}", p2.y);
println!("p3: {:?}", p3)
}
泛型的性能
rust 编译时会进行泛型代码单态化, 将泛型代码转化为具体类型的特定代码来保证效率