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

企业网站seo哪里好晋城客运东站网站开发

企业网站seo哪里好,晋城客运东站网站开发,适合权重小的网站做的专题,网站后期的维护在拥有继承的语言中#xff0c;可以定义一个名为shape的基类#xff0c;该类上有一个draw方法。其他的类比如Button、SelectBox继承shape。它们各自覆盖draw方法。调用这些子类的draw方法时#xff0c;就可以把它们统一当作shape来使用。不过Rust并没有继承#xff0c;如果…在拥有继承的语言中可以定义一个名为shape的基类该类上有一个draw方法。其他的类比如Button、SelectBox继承shape。它们各自覆盖draw方法。调用这些子类的draw方法时就可以把它们统一当作shape来使用。不过Rust并没有继承如果想做到这点就得另寻出路。这个出路就是使用trait对象。trait对象的作用类似基类。 一、定义trait对象 一语法格式 trait对象是一种类型定义语法如下 dyn 约束约束是trait约束或者生存期约束。可以有多个约束多个约束之间用连接。 例如 dyn X dyn X Send dyn X Send Sync dyn X static dyn X Send staticX是一个trait 二、使用trait对象 trait对象是动态尺寸类型。像所有的 DST 一样使用trait对象必须使用它的指针类型例如 dyn SomeTrait或Boxdyn SomeTrait。trait对象的指针包括 一个指向实现SomeTrait的类型T的实例的指针 一个指向虚拟方法表的指针。虚拟方法表也通常被称为虚函数表它包含了T实现的SomeTrait的所有方法T实现的SomeTrait的父trait 的每个方法还有指向T的实现的指针。 例子 pub trait Draw {fn draw(self); } pub struct Screen {pub shapes: VecBoxdyn Draw, //存放trait对象的vector。Boxdyn Draw就是trait对象它指向一个实现了Draw的类型的实例 }impl Screen {pub fn run(self) {for shape in self.shapes.iter() {shape.draw(); //在每个shape上调用draw方法}} } pub struct Button {pub width: u32,pub height: u32,pub label: String, } impl Draw for Button {fn draw(self) {// 实际绘制按钮的代码} } struct SelectBox {width: u32,height: u32,options: VecString, } impl Draw for SelectBox {fn draw(self) {// code to actually draw a select box} } fn main() {let screen Screen {shapes: vec![Box::new(SelectBox {width: 75,height: 10,options: vec![String::from(Yes),String::from(Maybe),String::from(No)],}),Box::new(Button {width: 50,height: 10,label: String::from(OK),}),],};screen.run(); }从上面代码中可以看出是不是与基类指针很类似 run并不检查元素是Button或者SelectBox的实例。如果实例没有实现trait对象所需的trait则编译错误 例如 fn main() {let screen Screen {shapes: vec![Box::new(String::from(Hi)),],};screen.run(); }这个编译错误因为String没有实现Draw 三、trait对象与泛型的区别 trait对象与带有trait约束的泛型结构体类似但是也有不同。泛型参数一次只能替代一个具体类型而trait对象则允许在运行时替代多种具体类型。 例如 pub struct ScreenT: Draw {pub shapes: VecT, } implT ScreenT where T: Draw {pub fn run(self) {for shape in self.shapes.iter() {shape.draw();}} }shapes是一个全是Button类型或者全是SelectBox类型的列表。总之所有元素类型是相同的。 而使用trait对象shapes能同时包含BoxButton和BoxSelectBox各个元素类型可以不同。 四、trait对象要求对象安全 只有对象安全的trait才可以组成trait对象。如果一个trait中所有的方法有如下属性时则该trait是对象安全的 1.返回值类型不为Self 2.方法没有任何泛型参数 Self代表自身。对象安全对于trait对象是必须的因为一旦有了trait对象就不再知晓实现该trait的具体类型是什么了。如果trait方法返回具体的Self类型但是trait对象忘记了其真正的类型那么方法不可能使用已经忘却的原始具体类型。同理对于泛型类型参数来说当使用trait时其会放入具体的类型参数此具体类型变成了实现该trait的类型的一部分。当使用trait对象时其具体类型被抹去了故无从得知放入泛型参数类型的类型是什么。 一个trait的方法不是对象安全的例子是标准库中的Clone trait。 pub trait Clone {fn clone(self) - Self; }String实现了Clone trait当在String实例上调用clone方法时会得到一个String实例。类似的当调用VecT 实例的clone方法会得到一个VecT 实例。clone的签名需要知道什么类型会代替Self因为这是它的返回值。 如果尝试做一些违反对象安全规则的事情编译器会提示你。 例如 pub struct Screen {pub components: VecBoxdyn Clone, }将会得到如下错误 error[E0038]: the trait std::clone::Clone cannot be made into an object Clone不能组成trait对象。
http://www.hkea.cn/news/14578860/

相关文章:

  • 做网站输入文本框做下拉具有品牌的网站建设
  • 网站备案快速备案建设电子商务网站的花费
  • php建站模板河南省建设部网站官网
  • 小公司做网站赚钱吗手机设计装修图的app
  • 网站开发完要过审是啥意思简单网站页面设计
  • 高端工作网站做网站需要多少钱 百度
  • 扬州网站优化电脑怎么做网站服务器
  • 上海沪港建设咨询有限公司网站国外网站空间需要备案吗
  • 怎么做卡商网站中国建设银行车主卡网站
  • 做社交网站的预算成都网络营销网站
  • 用html做个人网站代码郑州电力高等专科学校就业去向
  • 滨州网站建设 中企动力动易后台 网站统计调查 报表类型怎样使用
  • 中国建设银行网站怎么改支付密码是什么中国建设信息港网站
  • 品牌型网站建设哪家wordpress导入网站文章
  • 电商网站前端源码做围棋题最好的网站
  • 建站开发软件如何找网站推广
  • 做爰在线网站php网站开发参考文献
  • 爱站网络科技有限公司建筑方案设计考试
  • 好用的h5网站模板专业网站建设是哪家便宜
  • 做的比较好的手机网站wordpress 站点收录
  • 淡水网站建设哪家便宜wordpress语言切换 seo
  • 建设网站需要招聘哪些人域名备案完成了怎么建设网站
  • 深圳网站设计制作数字域名做网站
  • 海口网站建设找薇ls15227网站建设对标行业分析
  • 广东万高建设网站濮阳网站建设推广
  • 清河网站制作男男床做视频网站在线
  • 建设工程质量监督站网站免费申请商家收款码
  • 网站系统怎么做的定制高端网站的公司
  • 顺德大良网站建设国外免费推广网站
  • 做企业礼品的网站百度关键词优化费用