我最近开始学习rust,并观看了一个关于traits的视频,我了解到如果动态分派,traits也是有效的类型。如果一个变量的trait的代价是
1.必须是堆分配的,而不是堆栈分配的
1.具有昂贵的初始化成本
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
我试着在google上到处寻找这个模式什么时候是个好主意,但是我找不到任何东西,我只知道它是可能的,但是当涉及到代码性能时,它会有一点代价,所以我应该什么时候使用这个模式?
1条答案
按热度按时间zkure5ic1#
有几个地方需要这种模式:
Vec
),其项需要是异构的,但必须具有在容器中有用的最小功能。例如,软件开发中的规范示例往往是一组异构的回调函数(在Rust中表示为Box<dyn Fn>
)或一组异构的GUI小部件。(一个只能容纳一种小部件的容器有什么用?)impl Future
)的形式存在。在此之前,这些trait方法需要返回Box<dyn Future>
。在其他地方,这种模式可以大大简化代码。使用
dyn
擦除类型通常可以消除泛型类型参数,有时简化代码值得额外的堆分配,vtable查找和间接数据的相当小的运行时成本。