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

Rust学习笔记(四十一)迭代器(上)

  什么是迭代器
  对一系列项(item)执行某些任务的操作,叫做迭代器模式。迭代器负责遍历每个项,并且确定序列(遍历)何时完成。 Rust的迭代器是惰性的,除非调用消耗迭代器的方法,否则迭代器本身没有任何效果。例: fn main() {     let v1 = vec![1, 2, 3];     //惰性的,不使用不求值。     let v1_iter = v1.iter();     for ele in v1_iter {         println!("Got {}!", ele);     } } Iterator trait所有迭代器都实现了Iterator trait Iterator trait在标准库中定义,其内容大致如下: pub trait Iterator{   type Item;   fn next(&mut self) -> Option;   //... }
  type Item和Self::Item定义了与该关联的类型。实现Iterator trait需要我们定义一个Item类型,它用于next方法的返回类型(迭代器的返回类型)。 并且Iterator trait仅要求实现一个方法:next 每次返回迭代器中的一项 返回结果包裹在Some里 迭代结束返回None
  可以直接在迭代器上调用next方法,例: fn main() {     let v1 = vec![1, 2, 3];     //由于next方法会改变迭代器内部的状态(当前元素的索引)     //所以需要声明为mut     let mut v1_iter = v1.iter();     assert_eq!(v1_iter.next(), Some(&1));     assert_eq!(v1_iter.next(), Some(&2));     assert_eq!(v1_iter.next(), Some(&3)); }
  使用for循环时不加mut,因为for循环是一个语法糖,它会取得迭代器的所有权,并在其内部转换为可变的了。 几个迭代方法iter方法:在不可变引用上创建迭代器,这里指的是元素的不可变引用,不是迭代器本身不可变。 into_iter方法:创建的迭代器会取得元素的所有权。 iter_mut方法:迭代器中元素是可变引用。 消耗迭代器的方法
  在标准库中,Iterator trait有一些带默认实现的方法。其中有一些会调用next方法,这也是我们实现Iterator trait时必须实现next方法的原因之一。 我们把调用了next方法的方法叫做"消耗型适配器",因为它们会把迭代器耗尽。例如sum方法: 它会取得迭代器所有权 通过反复调用next方法来遍历所有元素 每次迭代都会把当前元素加到一个总和里,迭代结束时返回总和 例: fn main() {     let v1 = vec![1, 2, 3];     let v1_iter = v1.iter();     //这里需要显式指定total类型     //或者使用turbofish语法:     //let total = v1_iter.sum::();     let total: i32 = v1_iter.sum();     assert_eq!(total, 6); } 产生其它迭代器的方法
  定于在Iterator trait上的另外一些方法叫做"迭代器适配器",它们负责把当前迭代器转换为不同种类的迭代器。而且可以通过链式调用使用多个迭代器适配器来执行复杂操作,这种调用可读性较高。例如:map 接收一个闭包,闭包作用于每个元素 产生一个新的迭代器 例: fn main() {     let v1 = vec![1, 2, 3];     //由于迭代器惰性求值的特性,所以我们不调用消耗型方法时,map里的闭包不会产生任何作用     v1.iter().map(|e| e + 1);     //调用消耗型方法collect,收集结果为Vector     //需要显示声明结果的类型,因为编译器不知道我们想把结果收集为什么类型     //_下划线代表让编译器自己推断Vector内元素的类型     let v2: Vec<_> = v1.iter().map(|e| e + 1).collect();      assert_eq!(v2, vec![2, 3, 4]); }
  collect方法:它是一个消耗型适配器,会把结果收集到一个集合类型中。 使用闭包捕获环境
  filter方法,它也是一个迭代器适配器: 接收一个闭包,作用于参数 这个闭包在遍历迭代器的每个元素时,返回bool类型 如果闭包返回true:当前元素会被包含在filter产生的新的迭代器中 如果闭包返回false:当前元素不会被包含在filter产生的新的迭代器中 例: //src/lib.rs #[derive(PartialEq, Debug)] struct Shoe {     size: u32,     style: String, }  fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec {   //闭包捕获参数shoe_size并使用   shoes.into_iter().filter(|x| x.size == shoe_size).collect() }  #[cfg(test)] mod tests {     use crate::{shoes_in_my_size, Shoe};      #[test]     fn filer_by_size() {         let shoes = vec![             Shoe {                 size: 10,                 style: String::from("sneaker"),             },             Shoe {                 size: 13,                 style: String::from("sandal"),             },             Shoe {                 size: 10,                 style: String::from("boot"),             },         ];         let in_my_size = shoes_in_my_size(shoes, 10);         assert_eq!(vec![           Shoe {             size: 10,             style: String::from("sneaker"),         },         Shoe {             size: 10,             style: String::from("boot"),         },         ], in_my_size);         println!("{:#?}", in_my_size);     } }
  运行cargo test,可以看到测试通过并输出了结果。注意:运行时需要加cargo test -- --show-output,在第三十五节(编写测试之控制测试运行)已经学过:默认测试中通过时,println的内容不会被打印。

工业互联网解决方案互联网经济(IndustrialInternet)是新一代信息和通讯技术与区域经济发展深度融合的新设备运用方式和行业生态体系,根据和人机物系统软件等的彻底联接,已经搭建包含全部产业那些离不开的Chrome扩展插件虽然Chrome浏览器是个吃内存的怪兽,但是,它却因为启动速度调试功能等成为了程序猿的必备浏览器!今天有时间,整理一下自己最常用的一些Chrome扩展吧常用网页浏览非开发类扩展Ta理解了状态管理,就理解了前端开发的核心状态管理是前端整天遇到的概念,但是大家是否思考过什么是状态,管理的又是什么呢?我们知道,程序是处理数据的,数据是信息的载体,比如颜色是红色或蓝色这就是数据。那为什么不叫数据管理呢?英媒印度裔高管在硅谷高歌猛进,他还打破了扎克伯格的纪录英国星期日泰晤士报网站12月4日发表题为印度裔企业高管们正在硅谷高歌猛进的文章,作者为丹尼福特森。全文摘编如下当推特网站老板杰克多尔西在这家市值340亿美元的社交媒体公司任职15年腾讯技术公益创投计划启动中证网讯(记者万宇)12月7日,在大湾区科学论坛湾区科创峰会上,腾讯技术公益创投计划宣布启动。该计划重点关注缺乏资金资助技术支援运营指导传播渠道志愿者能力的五类社会企业和公益组织,恒大终于出现转机,许家印果然不简单文北桥校对北桥其实恒大之所以会出现问题,并不是因为恒大的房产有质量问题,而是因为恒大的步子跨太大了。在此之前的恒大,又是搞粮油,又是搞旅游,甚至还搞起了新能源汽车。并且许家印做新能如何正确避开互联网项目的坑?一直在做互联网项目,已经做了8年了。互联网项目呢,坑多肉少,自己单干的话赚不了多少钱,投资吧又担心被割了韭菜,团队运营吧,也只有团队长能赚到钱,项目一跑路,团队长也不见了,这是很多建设世界科技强国需要卓越工程师进入21世纪以来,全球科技创新进入空前密集活跃的时期,新一轮科技革命和产业革命正在重构全球创新版图重塑全球经济结构。科学技术从来没有像今天这样深刻影响着国家前途命运,从来没有像今天正式获得批准,台积电新工厂确定了!外媒这是新里程碑在全球缺芯的大环境下,老美为了得到台积电先进的技术和产能,可谓是煞费苦心。老美先是修改了芯片规则,台积电答应赴美建厂也是不得已而为之。另外美方还把台积电列入了风险清单,并强行向台积要求相互宝公开已运营以来的账目明细相互宝,一款互联网不伦不类的产品,让广大网民投入了不少心血,我本人自2018年以来为家人及父母等多人购买该款产品,之所以说是不伦不类的产品,因为它既不是保险,也不是公益,时至今日相外媒脸书抹黑泄密前员工,在国会搅浑水逃避监管近期有外媒披露,美国社交媒体巨头脸书(Facebook)从今年10月泄密者豪根在电视上公开身份以来,就试图通过游说者向国会两党议员提供不同的故事,一方面回应外界批评,另一方面达到分
搭建信息化到工业化控制层的桥梁导读开篇前言当前数字化经济正显现出前所未有的活力。从数字化车间到智能工厂,从工信部标准到产业联盟白皮书,从产业物联网到工业互联网,从大数据到云计算,从人工智能到5G等,全国企业的智EUV光刻机,能否顺利进入中国?说起光刻机,我们知道它是芯片制造不可或缺的设备!但我国相关产业的滞后,对该设备的自主制造,暂时还只能局限于中低端型号。虽然中低端的芯片,暂时已能满足绝大部分生产生活需要但对于旗舰型我们的对手只有苹果!,意气风发的新荣耀,离开华为能行?文丨艾斯哔在华为的芯片供应限制正式生效之后,业内知名分析师郭明錤便给出了断臂求生的建议,而任正非在经过几经考量之后,做出了最后且艰难的决定!为了延续华为的生机并给华为制造一条生路,产业互联网时代已经来临一概述也许马克思受所生活的那个时代所处的那种环境的局限,未能预测到当人类链接在一起的时候,信息的迭加智慧的叠加创造力的迭加等等,汇聚成一种对世界的伟大的变革力,经济的发展,商品的丰沼气爆炸的威力有多大?目前,世界上主要的发电方式包括火力发电水利发电太阳能发电大容量风力发电核能发电氢能发电潮汐发电生物能发电(沼气发电)地热能发电等等。而我国火电发电量占我国发电量的70。4,水电发电1。52。54。0平方的电线各能承受多大千瓦的功率?家庭电路中电线合理的承载功率分别为1。5平方的承载功率2200W2。5平方的承载功率3500W4平方的承载功率4800W。1。52。54平方的电线在不同的敷设条件不同的使用环境不同数字人民币试点呈现全面开花个人钱包开立数量过亿北京冬奥试点场景建设进入冲刺阶段数字人民币试点呈现全面开花不论是覆盖地区应用场景,还是钱包开立数量,数字人民币试点目前呈现全面开花态势。最新数据显示,数字人民币自动驾驶进入下半场出行市场格局料生变来源中国证券报上车后在座椅后背的屏幕上输入手机号后四位,点击确认,车辆便应声开启,在没有司机的情况下,汽车自动驶向目的地。11月25日,全国首个自动驾驶出行服务商业化试点在北京实施增速回落,阿里还有韧性吗?阿里的灵魂人物是马云,只要马云还能来去自由,阿里就不怕被别的移动互联公司超越,还是中国移动互联老大。移动互联公司不同于房地产公司,靠的是国外风投公司的资本,不靠国内的银行融资,可以理越辩越明!联想敢否直面挑战?别搞笑了。联想都不敢说自己是中国企业。还有什么理可以辩呢?联想到底是组装电脑的还是金融帝国呢?这又不是理论辩论,都是事实摆在那里,心知肚明的事!大老板有钱通天!不用挑战。无非是大环20年音响发烧友路过,留下10条玩音响的心得体会越玩越着迷01hr玩音响一定要追求最昂贵的器材吗?答案是否定的。一入音响深似海,玩音响最重要的是玩这个行为。自我感觉良好的音响,就是世界上最好的音响自我感觉美妙的音乐,就是世界上最好的音乐玩