rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-22 12:21:15  作者:皆是戏一场  网址:https://m.xinb2b.cn/know/rkp447716.html

头条地址:https://www.ixigua.com/i6765442674582356483github地址:见【了解更多】,今天小编就来聊一聊关于rust编程实战?接下来我们就一起去研究一下吧!


rust编程实战

视频地址

头条地址:https://www.ixigua.com/i6765442674582356483

github地址

github地址:见【了解更多】

介绍

Option类型代表了一个可选的值,每个Option要么是一个Some中包含一个值,要么是一个None。Option的定义如下:

pub enum Option<T> { None, Some(T),}

用法

Option主要有以下一些用法:

初始化值;作为在整个输入范围内没有定义的函数的返回值;作为返回值,用None表示出现的简单错误;作为结构体的可选字段;作为结构体中可借出或者是可载入的字段;作为函数的可选参数;代表空指针;用作复杂情况的返回值。

此处,我们举例说明一下“作为结构体可借出或者是可载入的字段”。

use std::thread;use std::time::Duration;struct Worker { thread: thread::JoinHandle<()>,}impl Worker { fn new() -> Worker { let thread = thread::spawn(move || { println!("start sleep 10 secs ..."); thread::sleep(Duration::from_secs(10)); }); Worker { thread: thread, } }}struct ThreadPool { workers: Vec<Worker>,}impl ThreadPool { fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut workers = Vec::with_capacity(size); for _ in 0..size { workers.push(Worker::new()); } ThreadPool { workers } }}impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { worker.thread.join().unwrap();//报错,无法编译,thread也无法实现copy trait println!("worker thread finished!"); } }}fn main() { let _pool = ThreadPool::new(3); println!("Hello, world!");}

上述例子中,实现了一个不完整的线程池,在Worker中,有一个字段为线程的句柄。当线程池对象drop时,无法使用mut对象中成员的引用(即通过&mut self.workers取出worker,在调用worker.thread.join())。为了解决此问题,我们可以将Worker结构体修改如下:

struct Worker { // thread: thread::JoinHandle<()>, thread: Option<thread::JoinHandle<()>>,}

完整代码为:

use std::thread;use std::time::Duration;struct Worker { // thread: thread::JoinHandle<()>, thread: Option<thread::JoinHandle<()>>,}impl Worker { fn new() -> Worker { let thread = thread::spawn(move || { println!("start sleep 10 secs ..."); thread::sleep(Duration::from_secs(10)); }); Worker { // thread: thread, thread: Some(thread), } }}struct ThreadPool { workers: Vec<Worker>,}impl ThreadPool { fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut workers = Vec::with_capacity(size); for _ in 0..size { workers.push(Worker::new()); } ThreadPool { workers } }}impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { // worker.thread.join().unwrap(); // println!("worker thread finished!"); if let Some(thread) = worker.thread.take() {//此处将thread从Worker的thread字段的Option中拿出来,使用了“Option类型作为结构体中可借出或者是可载入的字段” thread.join().unwrap(); println!("worker thread finished!"); } } }}fn main() { let _pool = ThreadPool::new(3); println!("Hello, world!");}

在ThreadPool的drop实现中,通过option的take方法,将thread从worker中移出,然后调用join,成功解决问题。

方法is_somepub fn is_some(&self) -> bool当Option中有值时,返回true。is_nonepub fn is_none(&self) -> bool当Option为None时,返回true。containspub fn contains<U>(&self, x: &U) -> bool where U: PartialEq<T>, 当Some中包含给定的值时,返回true。这个是nightly API。//示例 #![feature(option_result_contains)] let x: Option<u32> = Some(2); assert_eq!(x.contains(&2), true); let x: Option<u32> = Some(3); assert_eq!(x.contains(&2), false);as_refpub fn as_ref(&self) -> Option<&T>将&Option<T> 转换为Option<&T>//例子 let text: Option<String> = Some("Hello, world!".to_string()); let text_length: Option<usize> = text.as_ref().map(|s| s.len()); println!("still can print text: {:?}", text);takepub fn take(&mut self) -> Option<T>把值从Option中拿出来,留下None。let mut x = Some(2); let y = x.take(); assert_eq!(x, None); assert_eq!(y, Some(2)); let mut x: Option<u32> = None; let y = x.take(); assert_eq!(x, None); assert_eq!(y, None);copiedpub fn copied(self) -> Option<T>从Option<&T>得到Option<T>(通过复制来实现)let x = 12; let opt_x = Some(&x); assert_eq!(opt_x, Some(&12)); let copied = opt_x.copied(); assert_eq!(copied, Some(12));clonedpub fn cloned(self) -> Option<T>从Option<&T>得到Option<T>(通过克隆来实现)let x = 12; let opt_x = Some(&x); assert_eq!(opt_x, Some(&12)); let cloned = opt_x.cloned(); assert_eq!(cloned, Some(12));,
  • 郑州百家号企业蓝v认证的好处(企业百家号蓝V认证有什么权益)
  • 2024-11-22企业百家号蓝V认证有什么权益企业百家号是百度专门服务企业实现高效转化推出的平台,依靠百度这个巨大的搜索引擎,帮助企业和用户间构建了更有深度的连接力,打造私域提供了一个新的营销模式简单说,企业百家号认证就是在网上建立一个官方认证的。
  • 伤感文字控说说不要在遇见对的人之前(伤感句子精选)
  • 2024-11-22伤感句子精选不要在遇见对的人之前,用光最好的自己做不了恋人,就做陌生人,原来是真的继续冷漠的面对着一切,假装自己过的很好头一次无力到失去你眼眸的温柔身不由己的我们不再是我们,要有多难过我从未想过,我错过了的,是怎。
  • 5个去脸部皱纹的方法(脸部皱纹的方法有什么)
  • 2024-11-22脸部皱纹的方法有什么喝茶去皱纹:茶叶含有的茶多酚、茶素、蛋白质、氨基酸、维生素、矿物质、芳香类化合物都非常丰富,经常喝茶的人皮肤白嫩,脸部的皱纹也会减少椰油去皱:椰子油含有可以清除自由基的抗氧化物质,可以滋润肌肤,减少皮。
  • 重庆必吃十大美食排行榜(舌尖上的重庆)
  • 2024-11-22舌尖上的重庆大家好,请叫我重庆“吴彦祖”,我跟大明星吴彦祖最大的区别就是,我不姓吴!不是跟你冒皮皮(重庆话翻译:装B、高调的意思),这几年在“山城”一天天跟到女朋友混,我也算得上是半个重庆崽儿了!没得那些假米日眼。
  • 用过的冰箱可以躺着运输吗
  • 2024-11-22用过的冰箱可以躺着运输吗冰箱背壁内的底部会有一台压缩机,这个压缩机就目前市场来看,一般都采用了往复(活塞)式的的设计而压缩机的底部以及电动机的罩壳内有一些润滑油,如果在搬运过程中,冰箱有着过度的倾斜或者是平放的话,都会使润滑。
  • 重庆沙坪坝新建火车站(沙坪坝火车站综合交通枢纽轨道铺设完工)
  • 2024-11-22沙坪坝火车站综合交通枢纽轨道铺设完工9月5日,沙坪坝火车站综合交通枢纽,工人正在对轨道进行细微调校,以达到通车条件该枢纽工程主要包括高铁站房及站场改造、城市轨道交通、综合交通枢纽、城市道路改造和上盖物业开发等内容目前,站内7条轨道已铺设。
  • 光芒程亦治为什么找徐博士盖房子(光芒戴家为何取消婚约)
  • 2024-11-22光芒戴家为何取消婚约#光芒张新成#文/罗小可由张新成、蔡文静、王一楠、王自健等主演的电视剧《光芒》正在热播中,该剧讲述了有志青年程亦治跟千金大小姐吴丽姿共同奋斗成长的励志爱情故事张新成饰演的是男主角程亦治,蔡文静饰演的是。
  • 历史真实的四大才子(古人有瘾9岁说不清话)
  • 2024-11-22古人有瘾9岁说不清话客户端北京9月7日电题:9岁说不清话、27年屡试不中…他却与唐伯虎并列四大才子?作者任思雨提到江南的“四大才子”:祝枝山、唐伯虎、文徵明和徐祯卿,大家普遍都会认为,他们诗文书画样样精通,肯定从小就是“。
  • 苹果手机微信怎么清理缓存 微信怎么清理缓存
  • 2024-11-22苹果手机微信怎么清理缓存 微信怎么清理缓存微信作为当下最受欢迎的社交工具,几乎成为人人必备的应用,无论生活工作已经越来越离不开微信我们每天都高频率的使用这个软件,自然也就会积累很多的缓存的文件不看不知道,一看吓一跳,不信你进入微信“我—设置—。
  • 黛珂水乳跟哪种防晒霜配合使用(适合秋冬的防晒霜推荐)
  • 2024-11-22适合秋冬的防晒霜推荐秋冬护肤最容易忽略,但其实最重要的一项步骤,就是“防晒”很多人觉得秋冬季阳光弱,所以紫外线强度也会减弱,这个时候偷懒不做防晒也不会有什么大问题这样做可就是大错特错了确实相比春夏季而言,秋冬季的紫外线光。
  • 教你轻松去眼袋小妙方(7个妙方助你轻松去眼袋)
  • 2024-11-227个妙方助你轻松去眼袋现在生活节奏加快,生活和工作压力大,很多人都习惯熬夜,也因为熬夜,脸上挂着两个大大的眼袋看上去十分无精打采,也影响美观,所以有很多mm苦于没有办法消除眼袋,到底如何去除眼袋呢?下面小编推荐7个妙方,助。
  • 王者荣耀新英雄蒙恬怎么出装(新英雄蒙恬出装推荐)
  • 2024-11-22新英雄蒙恬出装推荐方案一抵抗之靴+暗影战斧+宗师之力(冰痕之握)+不祥征兆+魔女斗篷+复活甲(名刀)推荐理由:蒙恬的防御状态属于远程攻击,不但可以触发宗师之力和冰痕之握的被动,同时还能附带暴击效果,所以蒙恬非常适合出宗。