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

网站后台文章添加成功 不显示注册安全工程师是干什么的

网站后台文章添加成功 不显示,注册安全工程师是干什么的,做一个公司网站的费用,哈尔滨建站的系统2020-11-25 更新#xff1a;修正了C 20中的concept语法在上一篇文章 https://zhuanlan.zhihu.com/p/76740667 中#xff0c;我介绍多态、静态分发和动态分发的概念#xff0c;以及他们各自在C和Rust中的实现方式。在本文中#xff0c;我会重点讲Rust中的Trait实现的静态分发…2020-11-25 更新修正了C 20中的concept语法在上一篇文章 https://zhuanlan.zhihu.com/p/76740667 中我介绍多态、静态分发和动态分发的概念以及他们各自在C和Rust中的实现方式。在本文中我会重点讲Rust中的Trait实现的静态分发与C 20准确的说现在还叫做C 2a中的concepts的区别。在具体介绍这个区别之前我想跟大家介绍一个概念叫做duck typing鸭子类型。鸭子类型呃……你没有看错这个鸭子就是你平常理解的那个鸭子我也没有翻译错……鸭子类型[1]是鸭子测试的一个应用如果它走起来像鸭子也跟鸭子一样发出嘎嘎的叫声那么它就是鸭子听起来似乎非常无厘头但这个模式实际上被广泛的应用于多种语言。在C中的应用template typename T concept Stream requires(T a, std::uint8_t* mut_buffer, size_t size, const std::uint8_t* buffer) {{ a.read(mut_buffer, size) } - std::convertible_tosize_t;{ a.write(buffer, size) } - std::convertible_tosize_t; };class Console { ... }; class FileStream { ... }; 在Golang中的应用type Stream interface {Read(uint32) []byteWrite([]byte) uint32 }type Console struct { ... } type FileStream struct { ... }func (c Console) Read(size uint32) []byte {... }func (c Console) Write(data []byte) uint32 {... } 在上面的两个例子中我们可以注意到Console和FileStream这两个类型都没有显示的声明自己兼容Stream concept(interface)但在编译阶段编译器可以根据他们实现的方法来判断他们支持Stream要求的操作从而实现多态。这个功能看似非常诱人省去了显式声明的麻烦但也带来了问题。鸭子类型的局限性程序员的造词能力通常是非常匮乏的大家每次要给变量命名时的抓耳挠腮可以证明这一点所以非常容易在方法名上重复但在两个语境中又可能具有完全不同的语义。举个例子template typename T concept Thread requires(T a, int signal) {{ a.kill(signal) }; };class DuckFlock { public:void kill(int amount); };void nofity_thread(Thread t) {t.kill(SIGUSR1); } 原本我以为给鸭群发了一个信号让它们打印一下状态结果一不小心就杀掉了10只鸭子[2]真的只能召唤华农兄弟了。Rust的设计在Rust中是不允许这种情况出现的必须显式的生命类型实现的是哪个traittrait Thread {fn kill(mut self, signal:i32); }trait Flock {fn kill(mut self, amount:i32); }struct DuckFlock {ducks: i32 }impl DuckFlock {pub fn new(amount: i32) - DuckFlock {DuckFlock{ ducks: amount }} }impl Thread for DuckFlock {fn kill(mut self, signal: i32) {if signal 10 {println!(We have {} ducks, self.ducks);} else {println!(Unknown signal {}, signal);}} }impl Flock for DuckFlock {fn kill(mut self, amount: i32) {self.ducks - amount;println!({} ducks killed, amount);} }fn main() {let mut flock DuckFlock::new(100);{let thread:mut Thread mut flock;thread.kill(10);}{let flock:mut Flock mut flock;flock.kill(10);}{let thread:mut Thread mut flock;thread.kill(10);} } 同样的这个例子我也放到Rust Playground欢迎大家前去玩耍。Markers在Rust中由于实现Trait必须要显式声明这就衍生出了一种特殊类型的trait它不包含任何的函数要求trait TonyFavorite {} trait Food {fn name(self) - String; }struct PeikingDuck;impl Food for PeikingDuck {fn name(self) - String {Peiking Duck.to_owned()} }impl TonyFavorite for PeikingDuck {}struct Liver;impl Food for Liver {fn name(self) - String {Liver.to_owned()} }fn eatT: Food TonyFavorite(food: T) {println!(Tony only eat his favorite food like {}, food.name()); }fn main() {eat(PeikingDuck);// eat(Liver); // compile error } 这里例子的Playground在此。事实上在Rust中类似的Marker还有非常多比如Copy、Sync、Send等等。在后续的文章中再跟大家逐一解释这些trait的含义与妙用。在下一节的文章中我会介绍Rust类型系统和C类型系统最大的不同之一Rust结构体不能继承以及为什么。敬请期待。延伸阅读上一篇黄珏珅C工程师的Rust迁移之路4- 继承与组合 - 中​zhuanlan.zhihu.com下一篇黄珏珅C工程师的Rust迁移之路6- 继承与组合 - 后​zhuanlan.zhihu.com参考^Duck typing https://en.wikipedia.org/wiki/Duck_typing^在Linux下SIGUSR1等于10
http://www.zqtcl.cn/news/935789/

相关文章:

  • 网页制作网站建设百度网站推广费用多少钱
  • 长沙网站建设软件wordpress加菜单
  • 网站建设教育板块wordpress $pagenow
  • 岳阳手机网站建设自己可以给公司做网站吗
  • 旅游网站建设目的关于建设网站的需求分析
  • 手机可以建立网站吗自己造网站
  • 厦门建网站哪家好手机编程网站
  • 网站搭建后台奥门网站建设
  • 电子商务网站免费模板展示型网站与营销型网站
  • 除了红动中国还有哪些设计网站宁波建网站哪家
  • 网站的建设费用预算策划书wdcp网站备份
  • 济南制作公司网站网站设计的实例
  • 网站建设需要的文案一个网站的后台怎么做
  • 电影网站建设模板营销方式都有哪些
  • 书店商城网站建设方案未央免费做网站
  • 北京房产网北京二手房企业网站seo方案案例
  • 大连品牌官网建站二级建造师最好的网站
  • python开发工具搜索引擎优化的英语简称
  • 做产品代理上哪个网站好东莞公司网上推广
  • 专业制作网站公司上海广告公司联系方式
  • 古交市网站建设公司四川省建设厅电子政务网站
  • 清河网站建设费用50万做网站
  • 怎么找网站的根目录平台类网站营销方案
  • 网站关键词 价格生成山西建设工程备案网站
  • 网站开发入哪个会计科目设计师自己的网站
  • php做网站界面代码定制网页设计报价
  • 重庆智能模板建站wordpress+widget+开发
  • vps网站空间时尚网站首页设计
  • 美容行业网站建设方案网站建设需求背景
  • 贵阳做网站找哪家好长沙部分风险区域调整