Rust 泛型与特性学习笔记
1. 泛型基础
Rust 提供了泛型编程的支持,可以写出更加通用、灵活的代码。泛型可以在代码中使用相同的逻辑处理不同类型的数据。
1.1 定义泛型类型
定义泛型类型需要使用 <T>
语法,其中 T
是一个占位符,代表任意类型。
rustCopy Codestruct Point<T> {
x: T,
y: T,
}
fn main() {
let integer_point = Point { x: 10, y: 20 };
let float_point = Point { x: 10.0, y: 20.0 };
}
1.2 定义泛型函数
定义泛型函数也需要使用 <T>
语法。
rustCopy Codefn get_larger<T: PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
fn main() {
let larger_integer = get_larger(10, 20);
let larger_float = get_larger(10.0, 20.0);
}
T: PartialOrd
表示 T
类型必须实现 PartialOrd
trait。
2. 特性基础
Rust 的特性是一种声明式接口,可以用于约束泛型类型。
2.1 定义特性
定义特性需要使用 trait
关键字。
rustCopy Codetrait Draw {
fn draw(&self);
}
2.2 实现特性
实现特性需要使用 impl
关键字。
rustCopy Codestruct Shape {
x: i32,
y: i32,
}
impl Draw for Shape {
fn draw(&self) {
println!("Shape at ({}, {})", self.x, self.y);
}
}
fn main() {
let shape = Shape { x: 10, y: 20 };
shape.draw();
}
3. 泛型与特性的结合使用
泛型和特性经常会结合在一起使用,以实现更加通用、灵活的功能。
3.1 定义泛型类型约束特性
rustCopy Codestruct Screen<T: Draw> {
components: Vec<T>,
}
impl<T> Screen<T>
where
T: Draw,
{
fn run(&self) {
for component in self.components.iter() {
component.draw();
}
}
}
fn main() {
let screen = Screen {
components: vec![
Shape { x: 10, y: 20 },
Shape { x: 30, y: 40 },
],
};
screen.run();
}
3.2 定义泛型函数约束特性
rustCopy Codefn draw_and_get_larger<T: Draw + PartialOrd>(a: T, b: T) -> T {
a.draw();
b.draw();
if a > b {
a
} else {
b
}
}
fn main() {
let larger_shape = draw_and_get_larger(
Shape { x: 10, y: 20 },
Shape { x: 30, y: 40 },
);
}
T: Draw + PartialOrd
表示 T
类型必须实现 Draw
特性和 PartialOrd
trait。