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

相关文章:

  • 在线制作书封网站标书制作教学
  • 专业制作网站制作c2c电子商务平台有哪些?
  • wp 企业网站模板网站建设怎样设置动态背景
  • 网站建设五大定位个人做考试类网站
  • 东莞模板网站设计建设银行官方网站认证
  • 网站管理系统图片建设上海公司网站
  • 请人用wordpress建站假期如何注册微信小程序商家
  • 网站免费源码下载网站建设的重要性与价值
  • 网站的作用有哪些宜宾建设教育培训中心网站
  • 做网站一年百万wordpress 收费会员
  • 潍坊网站建设公司有哪些内容试玩网站开发
  • 深圳网站优化哪家好如何利用网络广告进行推广
  • 网站建好了怎么做才赚钱在线外链工具
  • 如何做360购物网站身高差效果图网站
  • 精品课程网站建设 公司网站备案升级
  • 内外外贸购物网站建设重庆做网站设计
  • 关于建设网站的请示报告专业网站建设分为8步
  • 网站调用微信js视频做网站赚几百万
  • 网站建设策划表90设计网站会员全站通与电商模板的区别
  • 济南房产信息网站官网tk注册网站
  • 什么网站可以发布信息域名备案网站备案
  • 全椒有做网站的吗平凉哪家做企业网站
  • 公司网站建设合作协议对接网站建设是什么意思
  • 高端网站建设 上海网站开发的业务需求分析
  • 国示范校建设网站许昌那有做网站
  • 对于网站开发有什么要求小程序怎么做优惠券网站
  • 网站设计收费明细表深圳专业建站公司技术好
  • 网站空间在哪买好公司网站建设工作计划
  • 白山做网站wordpress子页面密码错误
  • 公司名称 网站域名 关联北京网页设计公司兴田德润优选