在 Rust 中,泛型(Generics)和特性(Traits)是两个强大的语言特性,用于增加代码的灵活性和复用性。

泛型(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