先推荐一个链接

理解 Rust 2018 edition 的两个新关键字 —— impl 和 dyn

官方文档中,impl是限定泛型的语法糖,所以

trait Trait {}

fn foo<T: Trait>(arg: T) {
} fn foo(arg: impl Trait) {
}

这2种情况是相同的

但是当impl做为返回值的时候就有不同了

trait Fly {
fn fly(&self) -> bool;
}
struct Duck;
impl Fly for Duck {
fn fly(&self) -> bool {
return true;
}
} fn foo<T>() -> T where T: Fly
{
Duck
}

fn main() {
}

这样编译会报错

expected type parameter `T`, found struct `std::boxed::Box`

将返回T改为Box<T>也仍然会报错

trait Fly {
fn fly(&self) -> bool;
}
struct Duck;
impl Fly for Duck {
fn fly(&self) -> bool {
return true;
}
} fn foo<T>() -> Box<T> where T: Fly
{
Box::new(Duck)
} fn main() {
}

这种情况用impl就不会报错

trait Fly {
fn fly(&self) -> bool;
}
struct Duck;
impl Fly for Duck {
fn fly(&self) -> bool {
return true;
}
} fn foo() -> impl Fly
{
Duck
} fn main() {
}

关于dyn

dyn用于&dyn Fly和Box(dyn Fly)这样的引用和智能指针的限定,表明Fly是一个trait而不是struct,不加dyn也不会报错。

最新文章

  1. C#开机自动启动程序代码
  2. EasyUi 方法传递多个参数值得方法
  3. LA 2678 Subsequence(二分查找)
  4. python(二)数据类型
  5. python setup.py uninstall
  6. MySQL【Update误操作】回滚(转)
  7. 1、Hibernate之生成SessionFactory源码追踪
  8. ECMAScript一元操作符
  9. jbpm4.4 spring整合
  10. POJ 2002 Squares 哈希
  11. C语言头文件的使用与写法
  12. 理解中WebAPI的属性和相关操作 FormBody和 FormUri等(WebAPI 二)
  13. 强烈推荐一款CSS导航菜单
  14. 原生js二级联动
  15. 设计模式(4)建造者模式/生成器模式(Builder)
  16. NHibernate教程(13)--立即加载
  17. java求素数
  18. UOJ #269. 【清华集训2016】如何优雅地求和
  19. VueJS第2天 初阅API(初识MarkDown)
  20. bzoj2002(lct模板)

热门文章

  1. this-3
  2. CentOS6.x静默安装Oracle12c
  3. 技术分享 | 云原生多模型 NoSQL 概述
  4. linux篇-linux下ffmpeg安装
  5. git实战-多分支开发-2022新项目
  6. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
  7. Git镜像
  8. 送分题,ArrayList 的扩容机制了解吗?
  9. UiPath Orchestrator安装步骤
  10. WPF 视频硬解码渲染播放(无空域)(支持4K、8K、高帧率视频)