Rust dyn - 动态分发 trait 对象

dyn - 动态分发 trait 对象

dyn是关键字,用于指示一个类型是动态分发(dynamic dispatch),也就是说,它是通过trait object实现的。这意味着这个类型在编译期间不确定,只有在运行时才能确定。

  • practice

trait object实现多态性。

假设有一个几何图形的类层次结构,例如圆形(Circle)和矩形(Rectangle),每种几何图形都有一个计算面积的方法。定义trait Shape来表示这个特征,并在每个几何图形中实现这个trait。

rust 复制代码
trait Shape {
    fn area(&self) -> f64;
}

struct Circle {
    radius: f64,
}

impl Shape for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }
}

struct Rectangle {
    width: f64,
    height: f64,
}

impl Shape for Rectangle {
    fn area(&self) -> f64 {
        self.width * self.height
    }
}

现在编写一个函数,可以计算不同类型几何图形的总面积。我们可以使用trait object来实现这个函数:

rust 复制代码
fn total_area(shapes: &[&dyn Shape]) -> f64 {
    let mut total = 0.0;
    for shape in shapes {
        total += shape.area();
    }
    total
}

&[&dyn Shape]类型的参数来接受几何图形的数组。数组中的每个元素都是一个对实现Shape trait的具体类型的引用。使用for循环遍历这个数组,并对每个元素调用area方法,计算它的面积,并将结果累加到总面积中。

创建一些具体的几何图形实例,并将它们传递给total_area函数,以计算它们的总面积:

rust 复制代码
fn main() {
    let shapes: Vec<&dyn Shape> = vec![
        &Circle { radius: 1.0 },
        &Rectangle { width: 3.0, height: 4.0 },
        //&Circle { radius: 1.5 },
    ];
    let total = total_area(&shapes);
    println!("Total area: {}", total);
}

输出结果正确:

相关推荐
番茄灭世神1 小时前
Rust学习笔记第2篇
rust·编程语言
shimly1234567 小时前
(done) 速通 rustlings(20) 错误处理1 --- 不涉及Traits
rust
shimly1234567 小时前
(done) 速通 rustlings(19) Option
rust
@atweiwei7 小时前
rust所有权机制详解
开发语言·数据结构·后端·rust·内存·所有权
shimly1234567 小时前
(done) 速通 rustlings(24) 错误处理2 --- 涉及Traits
rust
shimly1234568 小时前
(done) 速通 rustlings(23) 特性 Traits
rust
shimly1234568 小时前
(done) 速通 rustlings(17) 哈希表
rust
shimly1234569 小时前
(done) 速通 rustlings(15) 字符串
rust
shimly12345610 小时前
(done) 速通 rustlings(22) 泛型
rust
yezipi耶不耶10 小时前
我在 RTMate 里使用的高并发连接管理利器: DashMap
websocket·rust