dyn特性在论点位置的含义是什么?

时间:2020-05-22 17:22:01

标签: rust traits

我可以看到'和(静态)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的隐式限制来做到这一点)?

1 个答案:

答案 0 :(得分:2)

如果您熟悉C ++ / Java,那么dyn对应于“接口引用”,因此它暗示着动态多态性(因此需要大量的引用跳转,因此它会慢一些)。

impl是一种语法糖,它定义了函数的模板,因此,每次将函数与其他类型一起使用时,您将获得专门为此类型编译的函数的单独副本。因此,没有多余的跳跃,而是这些副本使可执行文件膨胀。 Rust的思想告诉使用<T>impl创建模板,除非编译的版本太多,表明可执行文件过于肿。