impl Trait:静态分发
dyn Trait:动态分发

静态分发:在编译期就确定了具体返回类型,函数只能返回一种类型。
动态分发:在运行时才能确定具体返回类型,函数可以返回多种类型。

Trait Object:指向trait的指针,假设Animal是一个triait,那么&Animal和Box<Animal>都是一种Trait Object。

胖指针:用于指代动态大小类型(DST)的引用和原始指针(切片或特征对象)。胖指针包含一个指针以及一些使DST完成(例如长度)的信息。

返回值为impl Trait时用dyn Trait是没问题的

示例代码:

trait Animal {fn get_kind(&self) -> String;fn default_impl(&self) {println!("default impl");}
}impl dyn Animal {fn trait_object() {println!("trait object");}
}#[derive(Debug)]
struct Dog {}impl Animal for Dog {fn get_kind(&self) -> String {"Dog".to_string()}
}struct Cat {}impl Animal for Cat {fn get_kind(&self) -> String {"Cat".to_string()}
}// 静态分发
fn get_animal_static() -> impl Animal {let x = 1;if x == 1 {Dog {}} else {Dog {}}
}// 动态分发
fn get_animal_dyn() -> Box<dyn Animal> {let x = 0;if x == 1 {Box::new(Dog {})} else {Box::new(Cat {})}
}fn main() {let dog = Dog {};dog.default_impl();let cat = Cat {};cat.default_impl();// 只有 trait objects 才能调用// dog.trait_object();// cat.trait_object();<dyn Animal>::trait_object();let _ = &<dyn Animal>::trait_object();let animal = get_animal_static();// Dogprintln!("{}", animal.get_kind());let animal = get_animal_dyn();// Catprintln!("{}", animal.get_kind());
}

参考:
胖指针:
https://www.sohu.com/a/475756949_121124378

impl Trait & dyn Trait
https://zhuanlan.zhihu.com/p/23791817
https://zhuanlan.zhihu.com/p/109990547

Rust impl Trait和dyn Trait相关推荐

  1. rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait

    缘起 一切都要从年末换工作碰上特殊时期, 在家闲着无聊又读了几首诗, 突然想写一个可以浏览和背诵诗词的 TUI 程序说起. 我选择了 Cursive 这个 Rust TUI 库. 在实现时有这么一个函 ...

  2. 【Rust投稿】捋捋 Rust 中的 impl Trait 和 dyn Trait

    本文来自 PrivateRookie 的知乎投稿:https://zhuanlan.zhihu.com/p/109990547 缘起 一切都要从年末换工作碰上特殊时期, 在家闲着无聊又读了几首诗, 突 ...

  3. Rust学习之——From Trait和Into Trait以及“类型”到字符串的转换

    一次奇怪的实践 今天看了一个demo,为自定义类型到String类型的转换实现了From Trait下的from方法,但是是调用into方法来执行该转换.一开始就觉得很离谱.具体如下所示: struc ...

  4. rust(13)-闭包作为参数 trait泛型

    继续以解一元多次方程割线法为例 下面把闭包作为参数,定义trait泛型: 定义范型,规定该函数的com_fn参数只接受泛型F:Fn(f64)->f64 trait类型 pub fn f_comp ...

  5. Rust 12: 面向对象详解(struct + impl + trait)

    文章目录 struct impl trait 扩展阅读 总结 struct关键字用于定义一个数据结构,可以类比为面向对象语言中的class. impl关键字可以为struct实现关联的成员方法. tr ...

  6. Rust, Trait Object, Object Safty

    写了下面一段: async fn put<'a, S, E, F>(store: Arc<Mutex<dyn Storer<'a, dyn Stream<Item ...

  7. Rust Trait简介

    Rust trait简介 内容总结自<The Rust Programing Language> 首先简单说一下泛型:这个基础和C++的模板大概类似,从语法编译层面提供一种接收任意类型的手 ...

  8. rust - trait学习

    通过对<Rust 程序设计语言>,<通过例子学 Rust 中文版>以及令狐一冲老师对相关知识点的学习总结而成. rust - trait学习 1 trait 的基本含义 2 定 ...

  9. 我的RUST学习—— 【第十章 10-2】trait:定义共享行为

    trait 告诉 Rust 编译器某个特定类型拥有可能与其他类型共享的功能.可以通过 trait 以一种抽象的方式定义共享的行为.可以使用 trait bounds 指定泛型是任何拥有特定行为的类型. ...

最新文章

  1. 如何禁用请求库中的日志消息?
  2. mime设置 压缩html,MIME设置功能
  3. vue中使用better-scroll实现滑动
  4. cocoscreator editbox 只允许数字_用Cocos做一个数字调节框
  5. long在C语言中是非法字符吗,C程序设计实践——实验指导
  6. mysql导出逗号_Mysql导出逗号分隔的csv文件
  7. 2020年,程序员要做好苦日子的准备了!
  8. Params属性的用法 (beginner)
  9. 常用正则表达式(不断更新ing...)
  10. Cognos常见错误解决办法
  11. Car Net全文翻译
  12. axure灯箱效果_将时尚的灯箱效果添加到WordPress画廊
  13. 鉴黄师再受关注 网络色情治理任重道远
  14. DNS解析常见问题:如何清理DNS缓存?
  15. Vmware、Virtuozoo、Virtual Server 、Xen四款虚拟机的性能比较
  16. 系统论、控制论和信息论
  17. cad转dxf格式文件太大_高版本的CAD图纸怎么转换成低版本的DXF格式?
  18. 机器人的弊议论文_机器人的利弊作文800字
  19. 一个页面两个或多个swiper vue中一个页面多个swiper互相干扰 swiper轮播冲突
  20. 如果拿破仑年轻时没有经历过窘迫而绝望的生活

热门文章

  1. 【开发教程8】疯壳·开源蓝牙心率防水运动手环-三轴计步伐
  2. listview的使用
  3. MYSQL截取字符串前后数据
  4. 新装系统桌面没有计算机图标,新装电脑桌面没有图标
  5. openpyxl 列 插入_openpyxl 基础操作
  6. [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介
  7. Web自动化处理“滑动验证码”
  8. 根据某三国游戏提供的武将资料,完成需求:
  9. 借势营销:锦鲤玄学、鸡汤安慰剂、故事养成……高考借势营销干货来了!
  10. SSM果园信息统计管理系统