泛型(Generics):
泛型允许你编写不依赖于具体类型的代码,使得函数和数据结构能够适用于多种数据类型。
函数中使用泛型:
// 泛型函数,计算两个值的最大值
fn max<T: Ord>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
fn main() {
let result = max(3, 7);
println!("Max: {}", result);
let result_str = max("abc", "xyz");
println!("Max: {}", result_str);
}
在上述例子中,max 函数使用了泛型 T: Ord,表示 T 必须实现 Ord 特性(即具有比较大小的能力)。这样,我们可以使用这个函数比较数字或字符串等实现了 Ord 特性的类型。
结构体中使用泛型:
// 泛型结构体
struct Pair<T> {
first: T,
second: T,
}
fn main() {
// 创建 Pair 结构体的实例
let pair_of_int = Pair { first: 10, second: 20 };
let pair_of_str = Pair { first: "hello", second: "world" };
}
在这个例子中,Pair 是一个泛型结构体,可以用来存储两个相同类型的值。
特性(Traits):
特性定义了一种行为,允许类型实现这种行为。类似于其他语言的接口或抽象类。
// 定义一个特性
trait Shape {
fn area(&self) -> f64;
}
// 实现特性 for Circle 结构体
struct Circle {
radius: f64,
}
impl Shape for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
}
fn print_area(shape: &dyn Shape) {
println!("Area: {}", shape.area());
}
fn main() {
let circle = Circle { radius: 5.0 };
print_area(&circle);
}
在这个例子中,Shape 是一个特性,它有一个 area 方法。Circle 结构体实现了 Shape 特性,提供了计算圆形面积的具体实现。print_area 函数接收任何实现了 Shape 特性的对象,并调用其 area 方法。
通过泛型和特性,Rust 提供了强大的工具,使得代码能够更灵活、通用,并在不失安全性和性能的前提下提高复用性。
转载请注明出处:http://www.zyzy.cn/article/detail/13729/Rust