范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Rust学习笔记(四十二)迭代器(下)改进命令行项目

  使用Iterator trait创建自定义迭代器
  只需要实现Iterator trait的next方法就可以,例: //src/lib.rs struct Counter {     count: u32, }  impl Counter {     fn new() -> Counter {         Counter { count: 0 }     } }  impl Iterator for Counter {     //此语法后面会学     type Item = u32;      fn next(&mut self) -> Option {         if self.count < 5 {             self.count += 1;             Some(self.count)         } else {             None         }     } }  #[test] fn calling_next_directly() {//能从1迭代到5     let mut counter = Counter::new();     assert_eq!(counter.next(), Some(1));     assert_eq!(counter.next(), Some(2));     assert_eq!(counter.next(), Some(3));     assert_eq!(counter.next(), Some(4));     assert_eq!(counter.next(), Some(5));     assert_eq!(counter.next(), None); }  #[test] fn using_other_iterator_trait_methods() {     let sum: u32 = Counter::new()//新建一个1到5的迭代器     .zip(Counter::new().skip(1))//生成一个跳过1的迭代器(2-5),然后与上面的迭代器生成一个元素是元组的新迭代器(1, 2)(2, 3)(3, 4) (4, 5)     .map(|(a, b)| a * b)//元组两个元素相乘=2,6,12,20     .filter(|x| x % 3 == 0)//留下能被3整除的是6,12     .sum();//求和=18      assert_eq!(sum, 18); } 使用闭包和迭代器改进37节命令行项目
  先找到Rust学习笔记(三十七)命令行项目实例里的代码,这里不给出完整代码 pub struct Config {     pub query: String,     pub filename: String, }  impl Config {     pub fn new(args: &[String]) -> Result {         if args.len() < 3 {             return Err("not enough arguments");         }         let query = args[1].clone();         let filename = args[2].clone();         Ok(Config { query, filename })     } }
  这里由于new函数的参数是一个引用,所以需要clone出要查询的内容和文件名,然后构造Config的实例,这样Config实例才能拥有它俩的所有权。这里我们学习了迭代器,就可以传入一个拥有所有权的迭代器,就不用clone参数了。 //src/main.rs use std::env; use cmd_line::{self, Config};  use std::process; fn main() {     //unwrap_or_else用于Result后,Result是Ok时直接返回Ok内的值。     //Err时执行参数中的闭包,类似于匿名函数,err是参数,{}里是函数体(后面详解)     let config = Config::new(env::args()).unwrap_or_else(|err| {         println!("Problem parsing arguments: {}", err);//打印错误         process::exit(1);//终止程序     });     //使用if let匹配错误情况,当run函数返回Err时会执行{}内逻辑     if let Err(e) = cmd_line::run(config) {       println!("Applocation error: {}", e);//打印错误       process::exit(1);//终止程序     }; } //src/lib.rs pub struct Config {     pub query: String,     pub filename: String, }  impl Config {     pub fn new(mut args: std::env::Args) -> Result {         if args.len() < 3 {             return Err("not enough arguments");         }         args.next(); //由于第一个参数没有用,所以直接执行next消费掉                      // let query = args[1].clone();         let query = match args.next() {             Some(arg) => arg,             None => return Err("Did not get a query string!"),         };         // let filename = args[2].clone();         let filename = match args.next() {             Some(arg) => arg,             None => return Err("Did not get a file name!"),         };         Ok(Config { query, filename })     } }  pub fn search<"a>(query: &str, contents: &"a str) -> Vec<&"a str> {     // let mut results = Vec::new();     // for line in contents.lines() {     //     if line.contains(query) {     //         results.push(line);     //     }     // }     // results     //减少临时变量     contents         .lines()         .filter(|line| line.contains(query))         .collect() }
  这里search改完了,search_case_insensitive也按照这个例子改。 性能比较
  前面把for循环的search改成了使用迭代器实现,通过性能测试,发现迭代器版本性能更好。这是因为迭代器,作为一个高级的抽象,被编译成了与手写的底层代码性能差不多的代码。 零开销抽象(Zero-Cost Abstraction)
  前面所说的高级的抽象就叫做零开销抽象或零成本抽象,使用它时不会引入额外的运行时开销。
  作为另一个例子,这里有一些取自于音频解码器的代码。解码算法使用线性预测数学运算(linear prediction mathematical operation)来根据之前样本的线性函数预测将来的值。这些代码使用迭代器链来对作用域中的三个变量进行了某种数学计算:一个叫 buffer 的数据 slice、一个有 12 个元素的数组 coefficients、和一个代表位移位数的 qlp_shift。例子中声明了这些变量但并没有提供任何值;虽然这些代码在其上下文之外没有什么意义,不过仍是一个简明的现实中的例子,来展示 Rust 如何将高级概念转换为底层代码:let buffer: &mut [i32]; let coefficients: [i64; 12]; let qlp_shift: i16;  for i in 12..buffer.len() {     let prediction = coefficients.iter()                                  .zip(&buffer[i - 12..i])                                  .map(|(&c, &s)| c * s as i64)                                  .sum::() >> qlp_shift;     let delta = buffer[i];     buffer[i] = prediction as i32 + delta; } ```language
  为了计算 prediction 的值,这些代码遍历了 coefficients 中的 12 个值,使用 zip 方法将系数与 buffer 的前 12 个值组合在一起。接着将每一对值相乘,再将所有结果相加,然后将总和右移 qlp_shift 位。
  像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个适配器,接着消费了其值。Rust 代码将会被编译为什么样的汇编代码呢?好吧,在编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用不到循环:Rust 知道这里会迭代 12 次,所以它"展开"(unroll)了循环。展开是一种移除循环控制代码的开销并替换为每个迭代中的重复代码的优化。
  所有的系数都被储存在了寄存器中,这意味着访问他们非常快。这里也没有运行时数组访问边界检查。所有这些 Rust 能够提供的优化使得结果代码极为高效。现在知道这些了,请放心大胆的使用迭代器和闭包吧!他们使得代码看起来更高级,但并不为此引入运行时性能损失。

计算机毕业设计SpringBootLayUI仓库管理系统仓储调度物流管理需求实现材料仓库的管理提供材料出入库管理等实用功能。材料入库管理材料检验入库入库查询入库类别按月统计材料出库管理材料库存查询材料出库出库查询出库类别按月统计辅助管理仓库系统的人员管SpringMVC执行流程在学习框架之前,首先来了解一下SpringMVC框架的整体请求流程和使用到的API类。SpringMVC框架是高度可配置的,包含多种视图技术,例如JSPFreeMarkerTile计算机毕业设计之全网无敌的SpringBoot医院管理系统技术Java后端SpringBootMyBatisPlusMySQL前端LayUIEchartsJQuery功能介绍门诊管理挂号挂号选择挂号病人填写医生给患者诊查信息按照病因选择相地方康养集团苏州康养集团正式成立,重点打造精品示范工程9月11日上午,苏州市健康养老产业发展集团有限公司揭牌仪式暨长三角健康养老研讨会在苏州举行。苏州康养集团与德国胜拓辅具日本松下辅具日本美邸养老美国魅力花园中海企业发展集团香港远东宏计算机毕业设计之SpringBoot服装商城小程序技术框架SpringBootMyBatisMySQLVue。jsShiro运行录屏计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计之springboot旅游推荐系统项目简介采用前后端分离架构RESTfulAPI风格接口化Json形式数据传输前端页面进行了升级,引用了一些基本的组件,如dataTables。jsbootstrap。jsbootb计算机毕业设计之顶尖版SpringBoot物业管理系统技术后端技术springbootmybatisplus前端框架layui开发工具IDEA项目构建工具maven功能系统用户管理管理使用该系统的用户信息,包括系统用户的添加修改删除单计算机毕业设计之SpringCloud校内资源网开发框架SpringCloudMyBaitsVue。jsEchartsFastDFSMySQL运行截图计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕业设计计算机毕计算机毕业设计springbootfastdfs私有云存储云盘文件管理系统项目所用技术后端(1)SpringBoot(2)MyBatisPlus(3)Shiro(用户角色权限,Session管理,单点登录)(4)Redis(5)DataDictionar计算机毕业设计之SpringBoot垃圾分类与回收公益平台(精品)功能图灵程序设计(1)用户功能垃圾分类与回收公益平台的主要功能是帮助用户了解相关新闻资讯垃圾分类与回收的相关知识和常识以及如何进行正确的归类投放。(2)回收者功能回收者的只要作用是计算机毕业设计之SpringBootVue。js点餐小程序精品功能后台1。超级管理员(具有该系统所有权限)登录查看系统所有管理员操作可新添加管理员并分配系统已有角色可对已有管理员进行信息编辑可对除超管外的其他管理员账号禁用启用(一经禁用便不可
2021未来全宅论坛(成都站)今日盛大举行9月28日,2021未来全宅巡回论坛(成都站)于成都总府皇冠假日酒店盛大举行。这是继3月26日4月23日成功举办杭州站武汉站全宅论坛及7月5日在2021CIT中国全宅影音集成展上举音响影院新品发布暨合作伙伴签约仪式于成都举行9月28日,借2021未来全宅巡回论坛(成都站)举办之际,原声科技于成都总府皇冠假日酒店3楼宴会厅举行了音响影院新品发布暨合作伙伴签约仪式。原声科技是一家基于家庭影院音响场景,以提2021未来全宅论坛(成都站)影音集成分论坛及展区报道9月28日下午,2021未来全宅巡回论坛(成都站)2个分论坛及全宅集成知名品牌产品展览演示活动继续于成都总府皇冠假日酒店举行。上午,2021未来全宅论坛(成都站)举行了主论坛嘉宾讲Technics推出EAHAZ60AZ40真无线耳机知名黑胶唱盘机品牌Technics最近推出了两款新的真无线耳机EAHAZ60以及EAHAZ40,两款新品均采用了Technics独有的JustMyVoice技术,能够有效改善通话过NAD推出混合数字功放C399HybridDigitalDAC最近,NAD为其Classic系列推出了一款旗舰新品C399HybridDigitalDAC,官方宣称其性能和价值均提升了一个水平。既是旗舰定位产品,C399搭载了NAD的Hybr双十一过半,哪些手机销量高?iPhone12果然最香以前的双11主要就是11月11日一天时间,现在的双11则直接从十月底就开始造势。如今,双11过半,很多优惠活动已经倍受追捧。哪些手机成为双11的赢家呢?我们具体来看一下。双11销量ViewSonic(优派)TX5000K客厅百寸大屏市场的有力竞争者,拥有抢眼色彩的LED超短焦投影新贵当家用投影机进入到固态新光源的时代,激光与LED光源之间的竞争越发激烈,越来越多优秀的新机型在市场中迸发。不过,在聚焦于客厅影院的超短焦投影机市场之中,激光光源似乎走得更远,基本上9。28成都蜂巢易网BeeconX亮相2021未来全宅巡回论坛(成都站)9月28日,2021未来全宅巡回论坛参展商蜂巢易网BeeconX亮相2021未来全宅论坛(成都站)。9月28日,2021未来全宅巡回论坛(成都站)将于成都总府皇冠假日酒店盛大举行。BowersampampampWilkins(宝华韦健)805D4精雕细琢的外形与音色最近在我的发烧友微信群里面发现有人发出800D4系列的网页截图,间接透露了BowersWilkins(下简称BW)新一代800Diamond系列要发布的消息。就在上个月底杂志出刊之25元收的主机,各位老铁们来看看老程是赚了还是赔了。导读出差回家第一天,就有一个小伙伴抱着一台主机来找老程说让老程回收,说实话我一看到这个机箱是真不想收了,这个机箱就告诉老程,这里面没啥好玩意,如果机箱拆出来电源不好的话,基本上就是芯片相同的显卡为啥品牌不同价格相差很多?差价到底出在什么地方导读三八女神节皮了一把,但是发现老程的粉丝依然是一群汉纸,好吧我已经绝望了,难道就没有妹纸来关注关注老程呢,老程可是和盈通一样,也可以风骚起来的,只要你关注了,那么老程就能把车飚的