游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Rust学习笔记(四十)闭包实例(简单缓存)

  针对三十九节中Cacher实现的限制,我们可以用HashMap代替结构体中的单个value。HashMap的key就是我们传入闭包的参数,value就是闭包执行的结果。当我们调用value方法时,首先看HashMap中有无与其对应的缓存,有则直接返回,无需执行闭包;没有则执行闭包,将传入的参数和返回的结果以键值对插入HashMap,最后返回结果。srclib。rspubmodcache{usestd::collections::HashMap;usestd::hash::Hash;F是闭包的类型,T是闭包的参数类型,R是闭包的返回类型pubstructCacherF,T,RwhereT:EqHashClone,由于T还是HashMap的key,所以它要求T实现了EqHashClone三个traitF:Fn(T)R,闭包的参数是T的引用,因为T传入闭包后,还需要将它和闭包的结果插入HashMap,如果传入的不是引用,那它的所有权移动至闭包内,导致后面无法插入HashMap{values:HashMapT,R,缓存闭包参数和闭包结果的键值对valuesetter:F,闭包}implF,T,RCacherF,T,RwhereT:EqHashClone,F:Fn(T)R,{pubfnnew(valuesetter:F)CacherF,T,R{Cacher{values:HashMap::new(),valuesetter:valuesetter,}}pubfnvalue(mutself,arg:T)R{HashMap中有想要的值,直接取出并返回,不需要调用闭包ifself。values。containskey(arg){self。values。get(arg)。expect(msg)}else{HashMap中没有想要的值执行闭包,计算出想要的值letvalue(self。valuesetter)(arg);由于后面要把参数和结果插入HashMap,所以参数和结果所有权被移动,无法直接返回只能重新从HashMap中通过参数的引用取出来再返回但是如果参数插入HashMap,那么它的所有权被移动,就无法使用它get值了所以这里先clone一个参数,然后把它当作key插入HashMap,这样后面依然能使用参数get对应的结果letkeyarg。clone();self。values。insert(key,value);返回该参数对应的结果self。values。get(arg)。expect(msg)}}}}srcmain。rsusestd::{thread,time::Duration};useadder::cache;项目(package)名::模块名fnmain(){letmutcachecache::Cacher::new(a:Stringi32{println!(参数是{}的闭包执行了。,a);letb:i32a。parse()。expect(msg);b});println!(获取缓存的值:{},cache。value(String::from(1)));println!(获取缓存的值:{},cache。value(String::from(1)));println!(获取缓存的值:{},cache。value(String::from(1)));println!(获取缓存的值:{},cache。value(String::from(4)));println!(获取缓存的值:{},cache。value(String::from(2)));println!(获取缓存的值:{},cache。value(String::from(2)));println!(获取缓存的值:{},cache。value(String::from(5)));}
  执行以上代码:参数是1的闭包执行了。获取缓存的值:1获取缓存的值:1获取缓存的值:1参数是4的闭包执行了。获取缓存的值:4参数是2的闭包执行了。获取缓存的值:2获取缓存的值:2参数是5的闭包执行了。获取缓存的值:5
  可以看出我们获取了3次字符串1对应的值,但是参数是1的闭包只执行了1次。同理,4、2、5也是一样的。
  注:由于教程没有给出此方案的代码,所以以上代码都是基于个人理解实现的,若有错误,欢迎大家批评指正。使用闭包捕获环境
  闭包可以访问定义它的作用域内的变量,而普通函数则不能。例:fnmain(){letx4;letequaltoxzzx;lety4;assert!(equaltox(y));}
  以上代码可以正常执行。但如果把闭包换为函数:fnmain(){letx4;fnequaltox(z:i32)bool{zx}lety4;assert!(equaltox(y));}
  运行会报错:cantcapturedynamicenvironmentinafnitem但是捕获环境会产生内存开销。闭包从所在环境捕获值的方式
  与函数获得参数的三种方式一样:取得所有权:FnOnce。将环境中值的所有权移动进闭包,其名称的Once部分代表了闭包不能多次获取相同变量的所有权的事实,所以它只能被调用一次。可变借用:FnMut。不可变借用:Fn
  创建闭包时,通过闭包对环境值的使用,Rust推断出具体使用哪个trait:所有的闭包都实现了FnOnce,因为所有闭包都至少会被调用一次没有移动捕获变量的实现了FnMut无需可变访问捕获变量的闭包实现了Fnmove关键字
  在参数列表前使用move关键字,可以强制闭包取得它所使用的环境值的所有权,适用于:当我们需要将闭包传递给新线程以移动数据使其归新线程所有时,此技术最管用。例:fnmain(){letxvec!〔1,2,3〕;letequaltoxmovezzx;println!({:?},x);equaltox(vec!〔1,2,3〕);}
  所有权被移动,后面在println中再次使用会报错。最佳实践
  当指定Fntraitbound时之一时,首先用Fn,基于闭包体里的情况,如果需要FnOnce或FnMut时,编译器会给出提示。

破解Win11的TPM及4GB内存限制微软的Win11系统在硬件兼容性上多了一些要求,其中内存要求4GB以上,还要支持TPM及安全启动功能,这让一些老平台不够标准升级。现在U盘神器Rufus3。16Beta2发布了……Nreal获超1亿美元C轮融资VR游戏PowerBeatsV(VRPinea9月23日讯)今日重点新闻:Nreal宣布完成超1亿美元C轮融资,本轮融资将用于新产品及技术研发、核心光学模块的量产等;ARVR娱乐服务商Fantasy360T……金嗓子AGMH2一部诚意满满的老人机,你心动了吗?最近有很多小伙伴问我,想给老人长辈买一部手机却不知道买什么好,给老人买手机不同于年轻人选择手机的这样一个特性。年轻人要性能,要玩大型游戏,然后又要拍照及自拍,还要拍美照发朋友圈……让AI真正服务于生活云米携手诺奖科学家让你拥有AI未来智能的这些年,人工智能、大数据、互联网、云计算等让我们的生活发生了巨大的改变,智能的潮流下,我们也在不断适应与探索,如何让不同年龄、背景、文化程度和生活习惯的人,能够更好地享受科技智……深圳华强北电子世界风貌华强北商业区位于广东省深圳市福田区,其前身是生产电子、通讯、电器产品为主的工业区域,其拥有厂房40多栋。在华强北路南北930米,东西1560米,商业区总面积1。45平方公里左右……开学不迷惑,入学必备蓝牙耳机,平价实用蓝牙耳机推荐心幸福的暑假也接近尾声了,同学们做好要开学准备了吗,开学的紧张兴奋之余,同学们可不要忘记了需要带去学校的物品,不然在校时需要用到才发现没带可是会很焦虑的呢。那么你们有蓝牙耳机了……5问荣耀50SE除了1亿像素快充,这款手机究竟表现如何?荣耀50系列,是荣耀数字系列的全新产品。而荣耀50系列,我认为意义也不仅仅在于迭代;这个产品系列,更是荣耀在历经波折之后的一次全新探索。回到手机本身,荣耀50SE尽管是荣……Windows系统中有哪些软件可以被你评为必装?我是Ex极致玩客多说无益,直接上干货1,Snipaste截图功能,用的比较多的就是图的贴图功能,它可以让你的截图置顶,这样就不用用的时候来回切换。2,新版Edge浏……盖茨基金会梅琳达和比尔盖茨将再捐150亿美元,梅琳达2年后可盖茨基金会网站当地时间7月7日发表声明称,盖茨基金会CEO马克苏兹曼(MarkSuzman)表示,梅琳达弗兰奇盖茨(MelindaFrenchGates)和比尔盖茨(BillG……厦门旅行时你住过什么特别的民宿吗?我觉得算厦门特别的民宿,不知道大家会不会也这样觉得哈。2020年9月去厦门鼓浪屿旅行时,入住了一家民宿,是一座已百年历史的建筑,当然,鼓浪屿的建筑大多数都是文物建筑了。这……爱奇艺进入暂时性名单不意味近期被强制摘牌和退市IT之家3月31日消息,美国当地时间周三,美国证券交易委员会(SEC)将百度、富途控股、爱奇艺、凯信远达医药和从事渔业养殖的Nocera加入预摘牌名单,这也是三月以来第三批被纳……4年时间烧光3亿,爱屋吉屋是如何从明星公司走到关门大吉的?爱屋吉屋,一家曾创造2年融资2。7亿美元的明星地产公司,曾被行业誉为颠覆者,没想到仅仅5年就关门了。现在,该公司的官方网站和App都已停止运营。在搜索引擎上搜索爱屋吉屋,……
USB摄像机和SDI摄像机哪个比较好?凯茉锐摄像机是一种可以把光学图像信号转变为电信号,以便于存储或者传输的视频硬件设备。光电信号很微弱,需通过预放电路进行放大,再经过各种电路进行处理和调整,最后得到的标准信号可以送到录……关于推荐算法的新规一旦落地,对于互联网行业会产生哪些影响首先,当前推荐系统是大数据技术重要的落地应用,在消费互联网时代,推荐系统体现出了巨大的价值,为互联网企业的快速发展,起到了很大的推动作用,可以说推荐系统是很多互联网产品进行价值……靠卖芯片吸金291亿!高通或许没想到,联发科的进步如此神速在手机芯片行业,美国高通算是首屈一指的巨头,在很长一段时间里,高通占据着手机芯片市场主导的地位。但高通在手机芯片领域的地位并没能一直保持下去,市调机构Counterpoi……2021。08。24数字货币快讯CryptoPunks总交易额突破8亿美元,创历史新高。上周NFT销售额突破2。2亿美元。Paypal在英国推出加密货币服务。Visa以约15万美元的价格购买了CryptoPu……进击的英特尔(INTC。US)赢得美国国防项目,发展芯片代工智通财经APP获悉,美国当地时间周一,英特尔(INTC。US)表示,其将在美国国防部一项计划的第一阶段提供商业晶圆代工服务,该计划旨在制造美国国防部系统所需的电路和商业产品。据……油耗水平持续下降,为啥负积分10万的车企却越来越多?5月24日,工信部发布《乘用车企业平均燃料消耗量与新能源汽车积分并行管理实施情况年度报告(2021)》。报告显示,在积分考核约束和积分收益激励下,我国汽车行业的平均油耗持续下降……朗盛扩大阻燃塑料的范围,用于家用电器设计朗盛扩大了其阻燃塑料的范围通过VDE认证的材料在终端产品上进行灼热丝测试高阻燃性能为部件设计提供更大的自由度有可能适用于电动汽车根据纽伦堡消费者研究协会……思必驰DUI正式发布,赋能智能终端开启对话时代大音希声,AIISDUI,2017思必驰DUI开放平台发布会于9月7日在北京歌华开元大酒店举行,近千余名开发者和行业资深人士、权威媒体莅临现场,思必驰CEO高始兴、首席科学家俞……26。88万元起,全新第四代汉兰达引领豪华大型SUV新浪潮更高处,尽揽天地!6月25日,广汽丰田TNGA豪华大型SUV全新第四代汉兰达正式上市。作为率先开辟豪华大七座SUV市场的全球战略车型,汉兰达已走过21年光辉历程,全球销量超44……终于有厂商这么干了,在手机镜头上堆料近几年手机厂商在拍照上的执著大家有目共睹,要么就搞超大底,传说中的底大一级压死人,要么就谷歌那种,靠着算法打遍天下,一套算法传五代,或者就是华为那种底大又靠算法的,双管齐下,效……十个问题问题告诉你华为P40Pro是否值得购买。(中)手感怎么样?上期我们已经说了,华为这台手机因为中框做了垂直,所以在双曲面当中手感算是非常的不错。同时因为上下也是曲面所以返回桌面的手势手感也是非常好,华为P40Pro的整……赚钱前的认知你得了穷病1hr每个人都有一个觉醒期,但觉醒的早晚决定人的命运。路遥某宝马先生曾分享过自己在迷茫时看路遥的《平凡的世界》,且不论爱情,它的核心点在于:觉醒。18岁那年我从农村……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网