我可以看到'
和(静态)dyn
的性状在返回位置上的区别,例如:
impl
vs
fn foo() -> Box<dyn Trait> {}
在fn foo() -> impl Trait {}
版本中,我被允许返回不同的类型,只要它们都实现了Trait,而在dyn
版本中,我仅被允许返回相同的类型(同样适用如果我返回参考)。
但是我看不到impl
在参数位置中的作用,例如:
dyn Trait
vs
fn foo(x: &dyn Trait) {}
两者之间有什么区别?为什么要使用其中一个? fn foo(x: &impl Trait) {} // syntatic sugar of `fn foo<T: Trait>(x: &T){}`
版本允许我做什么,而静态版本不允许(例如,我不能通过使用dyn
放宽对Sized
的隐式限制来做到这一点)?
答案 0 :(得分:2)
如果您熟悉C ++ / Java,那么dyn
对应于“接口引用”,因此它暗示着动态多态性(因此需要大量的引用跳转,因此它会慢一些)。
impl
是一种语法糖,它定义了函数的模板,因此,每次将函数与其他类型一起使用时,您将获得专门为此类型编译的函数的单独副本。因此,没有多余的跳跃,而是这些副本使可执行文件膨胀。 Rust的思想告诉使用<T>
,impl
创建模板,除非编译的版本太多,表明可执行文件过于肿。