我什么时候应该在 rust 中使用 trait 作为类型?

问题描述 投票:0回答:1

我最近开始学习 Rust 并且正在观看有关特征的视频并且我了解到如果动态调度特征也是有效类型。如果它具有

的成本,那么将具有特征的变量作为类型有什么意义
  1. 必须是堆分配而不是栈分配
  2. 具有昂贵的初始化成本
struct Animal;

trait Roars {
    fn roar(&self);
}

//implement trait roar
impl Roars for Animal {
    fn roar(&self) {
        println!("roarrrrrr")
    }
}

//implement a method rawr
impl Animal {
    fn rawr(&self) {
        println!("rawrrrrrrrrr")
    }
}

fn main() {
    let lion: Box<dyn Roars> = Box::new(Animal);
    let cheeta: Animal = Animal;
    lion.roar();
    cheeta.rawr()
}

>>>roarrrrrr
>>>rawrrrrrrrrr

我试着在谷歌上寻找这种模式什么时候是个好主意,但我找不到任何我所知道的东西是可能的但是在代码性能方面它会付出一些代价所以当我应该使用这种模式吗?

rust traits
1个回答
1
投票

有几个地方需要这个图案:

  • 您有一个容器(例如
    Vec
    ),其项目需要是异构的,但必须具有最少的功能才能在容器中使用。例如,软件开发中的典型示例往往是一组异构的回调函数(在 Rust 中表示为
    Box<dyn Fn>
    )或一组异构的 GUI 小部件。 (一个只能装一种widget的容器有什么用?)
  • 您正在使用需要返回实现某些特征的类型的方法编写特征,但无法命名实际类型,这排除了关联类型的使用。您经常会在 traits 的异步方法中看到这种情况,在
    TAIT
    稳定之前,这些方法还不能作为“异步”(或返回impl Future)存在。在那之前,那些特征方法需要返回
    Box<dyn Future>
    .

在其他地方,这种模式可以大大简化代码。使用

dyn
擦除类型通常可以消除泛型类型参数,有时简化代码值得额外的堆分配、vtable 查找和间接数据的相当小的运行时成本。

© www.soinside.com 2019 - 2024. All rights reserved.