我最近开始学习 Rust 并且正在观看有关特征的视频并且我了解到如果动态调度特征也是有效类型。如果它具有
的成本,那么将具有特征的变量作为类型有什么意义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
我试着在谷歌上寻找这种模式什么时候是个好主意,但我找不到任何我所知道的东西是可能的但是在代码性能方面它会付出一些代价所以当我应该使用这种模式吗?
有几个地方需要这个图案:
Vec
),其项目需要是异构的,但必须具有最少的功能才能在容器中使用。例如,软件开发中的典型示例往往是一组异构的回调函数(在 Rust 中表示为Box<dyn Fn>
)或一组异构的 GUI 小部件。 (一个只能装一种widget的容器有什么用?)TAIT稳定之前,这些方法还不能作为“异步”(或返回
impl Future
)存在。在那之前,那些特征方法需要返回Box<dyn Future>
.在其他地方,这种模式可以大大简化代码。使用
dyn
擦除类型通常可以消除泛型类型参数,有时简化代码值得额外的堆分配、vtable 查找和间接数据的相当小的运行时成本。