当前位置: 首页 > 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.dinnco.com/news/33109.html

相关文章:

  • 网站做多长时间才有流量竞价托管是啥意思
  • 如何写好网站开发技术文档广州做seo整站优化公司
  • 湖南建设监理员报名网站参考消息网国内新闻
  • 品牌科技公司排名全专业优化公司
  • 公司网站开发关键词seo教程
  • 网站建设服务项目seo培训资料
  • 建设企业查询网站福州seo网站推广优化
  • 信息管理系统网站开发手机端百度收录入口
  • 宝鸡做网站搜索引擎营销经典案例
  • 介绍自己的做的网站绍兴seo公司
  • 百度做一个网站怎么做呢怎样在百度上建立网站
  • 外贸婚纱网站什么是seo和sem
  • 网站建设公司的服务器seo报告
  • 龙口建网站公司哪家好网络推广方案怎么写
  • wordpress 使用mssqlseo博客教程
  • 网页设计培训班招生无锡seo公司找哪家好
  • wordpress setup-config.php空白网站seo优化的目的
  • 四川省乐山市建设银行网站线上销售平台都有哪些
  • 网站建设行业赚钱么亚马逊开店流程及费用
  • 宝安做棋牌网站建设哪家便宜成品视频直播软件推荐哪个好一点
  • 制作一个网站的费用如何获取热搜关键词
  • 响应式相册网站深圳网络推广系统
  • 营销型网站建设价格贵吗东莞网站制作
  • 用什么软件做网站广州seo关键词优化费用
  • 找山东制作app公司哈尔滨seo关键字优化
  • 辽源做网站公司品牌推广方式
  • 苏州做商城网站设计如何自己做一个软件
  • wordpress禁止自动更新seo排名分析
  • 男女同房做爰网站网络推广是什么职业
  • 怎么用大淘客做网站百度搜索引擎的特点