dyn 和 impl都是用于多态的,后面跟的都是一个trait,比如,我们有一个trait Shape
trait Shape {
fn area(&self) -> u64
}
trait Shape {
fn area(&self) -> u64
}
impl Shape for Rectangle {
fn area(&self) -> u32 {
self.x * self.y
}
}
dyn
fn dyn_dispatch(t: &dyn Shape) {
println!("area is {}", t.area());
}
dyn 是dynamic dispatch,发生在运行态,会创建一个trait object,这个trait object是一个fat object,其中一个指针指向传入的对象,vtable指向trait的method table,如果实际传入的对象只有在runtime才知道,那么只能用dyn,这会带来一点性能上的开销
impl
fn static_dispatch(t: &impl Shape) {
println!("area is {}", t.area());
}
impl 发生在compile time,也就是说rust会首先将 &impl Shape 换成实际的类型,这样在运行时没有额外的开销,所以优先使用 impl