当前位置: 首页 > news >正文

免费做外贸的网站运营商大数据精准营销获客

免费做外贸的网站,运营商大数据精准营销获客,网站建设 代理,网站设计与开发怎么做Rust的运行时多态 Rust的静态多态即编译时多态,通过**泛型特征约束(Generic Type Trait Constrait)**来实现; 那么动态多态(运行时多态)呢?答案是特征对象(Trait Object&#xff…

Rust的运行时多态

Rust的静态多态即编译时多态,通过**泛型+特征约束(Generic Type + Trait Constrait)**来实现;

那么动态多态(运行时多态)呢?答案是特征对象(Trait Object)

特征对象不是一个实例,而是一个结构体类型。

语法是dyn TraitName,编译时指示某个对象是实现TraitName的类型,其具体类型未知。

分析

程序运行时,要调用一个特征方法,需要两个要素:

  • 对象实例(对象类型未知,因此其编译期大小未知)
  • 特征的方法表

所以特征对象结构体必须获知以上两个要素。

发生运行时多态时,在编译阶段编译器无法辨别对象实例的类型,因此对象实例要素的大小无法获知,进而特征对象(Trait Object)的大小在编译阶段无法被确定,这决定了Trait Object只能存放在堆上,通过引用或智能指针来访问

指向特征对象的引用或智能指针,包含了两个指针成员,在程序运行时,ptr1在指向对象实例,ptr2指向该对象类型的Trait Method实现。

典型用例


#[derive(Debug)]
struct Journal {author: String,year: u16,from: String,
}
#[derive(Debug)]
struct Conference {author: String,year: u16,country: String,
}trait Summary {fn summary(&self) -> String;
}impl std::fmt::Debug for dyn Summary {fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {write!(f, "{}", self.summary())}
}impl Summary for Journal {fn summary(&self) -> String {format!("{}\t{}\t{}", self.author, self.year, self.from)}
}
impl Summary for Conference {fn summary(&self) -> String {format!("{}\t{}\t{}", self.author, self.year, self.country)}
}// can't defer concrete type in compile stage, trait constrain can't used here
// fn init_default(_type: &str) -> impl Summary {
//     if _type == "journal" {
//         Journal {
//             author: "hjd".to_owned(),
//             year: 2018,
//             from: "Nature".to_owned(),
//         }
//     } else {
//         Conference {
//             author: "hjd".to_owned(),
//             year: 2018,
//             country: "China".to_owned(),
//         }
//     }
// }// 只能使用特征对象进行动态分发,因为返回类型编译期无法推理获知
fn init_default(_type: &str) -> Box<dyn Summary> {if _type == "journal" {Box::new(Journal {author: "hjd".to_owned(),year: 2018,from: "Nature".to_owned(),})} else {Box::new(Conference {author: "hjd".to_owned(),year: 2018,country: "China".to_owned(),})}
}fn main() {let p1 = init_default("journal");let p2 = init_default("conference");let p3 = init_default("journal");let p4 = init_default("conference");let p_list = vec![p1, p2, p3, p4];// dyn Summary是一个特征对象类型,它忘记了自己之前的具体类型,只能调用Summary特征中的方法for p in p_list.iter() {println!("{:?}", p);}
}
http://www.hengruixuexiao.com/news/51432.html

相关文章:

  • 新建的网站如何做seo推广赚钱的平台有哪些
  • 广州住建官方网站百度经验官网登录
  • 长沙企业建站在线咨询seo文章代写一篇多少钱
  • 灯笼怎么做手工制作视频网站搜索优化公司
  • 佛山建设外贸网站精准引流的网络推广方法
  • 网站建设的成本主要有哪几项人民日报新闻
  • 备案域名价格搜索引擎优化的方法有哪些?
  • 视频网站程序品牌营销策划十大要点
  • 做网站需要画原型图么职业培训学校加盟合作
  • 四会城乡建设局网站东莞网站建设平台
  • 辽宁网站建设的网络科技公司百度竞价排名规则及费用
  • 长沙做网站建设公司营销模式100个经典案例
  • 织梦可以做哪些类型型网站网站seo优化是什么
  • 网站建设预付款比例seo的收费标准
  • 哪里有学编程的培训班短视频seo
  • 巴中网站建设公司谷歌外贸网站推广
  • 网站数据库订购个人网页生成器
  • 设计师培训怎么样seo公司排行
  • 电子商务都是做网站的吗百度竞价排名费用
  • 网站怎么做一盘优化排名营销外包团队怎么收费
  • 我的企业网站怎么seo软文什么意思
  • wordpress调试seo外包公司如何优化
  • 企业网站静态模板下载直播:英格兰vs法国
  • 专业的丹阳网站建设怎么推广公众号让人关注
  • 网站发布方式 提高网站关键词在线优化
  • 网站开发项目需求分析各大网站的网址
  • 导航网站链接怎么做游戏推广员拉人犯法吗
  • 重庆网站制网络营销策划的基本原则是什么
  • 做公司网站需要什么材料品牌营销方案
  • 手机网站图片锚链接怎么做什么是关键词搜索