rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-06 03:57:42  作者:皆是戏一场  网址: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));,
  • 鹿晗和周冬雨合影(鹿晗周冬雨为长春电影节点燃火炬)
  • 2024-11-06鹿晗周冬雨为长春电影节点燃火炬在今天举行的第十四届中国长春电影节闭幕式上,“传承大使”鹿晗与“形象大使”周冬雨共同担任点火嘉宾,两人从国际巨星成龙大哥手上接过火种,共同点燃火炬,象征着传承着中国电影人的热忱,传递电影力量,点亮了中。
  • 作文里的铺垫是什么意思(作文里的铺垫是什么)
  • 2024-11-06作文里的铺垫是什么铺垫是为主要人物出场或主要事件发生创造条件而着重描述渲染、进行陪衬衬托的一种表现手法铺垫的特点:是为主要情节蓄积酝酿的过程铺垫的作用:铺垫是主要情节的基石,能增加情节张力,制造悬念使情节具有合理性。
  • 上海310开头的身份证(身份证310开头的上海宁)
  • 2024-11-06身份证310开头的上海宁吐槽了春晚、拿了压岁钱、分了敬业福红包!2017年就真的正式开始啦!对于深扒君来说,新年愿望必然是:暴富!吃更多好吃的!给粉丝找更多福利!新的一年必然有新的规划!身份证310开头的上海宁,2017年这。
  • 撒野经典句子(撒野经典语录)
  • 2024-11-06撒野经典语录希望我们都能像对方一样勇敢没有谁的生活会一直完美,但无论什么时候,都要看着前方,满怀希望就会所向披靡有些意外是意料之中,有些意外是意料之外,而你,就是我意料之外的意外人就是这样的,想来想去,犹豫来犹豫。
  • lg滚筒洗衣机wdt14415d说明书(是时候换个省心的洗衣机)
  • 2024-11-06是时候换个省心的洗衣机家里波轮洗衣机使用了10年,只是按键掉漆掉膜严重,没有什么大毛病不过最大问题还是耗水、耗电,还有些噪音问题简单算一下,波轮洗衣机每天洗衣一次可能用掉0.15立方水,用电约0.1度一年用掉方的水52.5。
  • mac自带的画图工具(这5款简单绘图应用程序)
  • 2024-11-06这5款简单绘图应用程序Mac电脑的视网膜屏幕,精确的触摸板以及对各种输入的原生支持,使在Mac上进行素描绘画成为一种乐趣它可以为喜欢绘画创作者提供表达自己的各种机会,而且各种适用于Mac的绘图软件也是各具特点那么该如何选择。
  • 二〇二二年版标准地图发布(二〇二二年版标准地图发布)
  • 2024-11-06二〇二二年版标准地图发布来源:人民网-人民日报海外版本报北京电(记者谷业凯)自然资源部近日发布了2022年版标准地图和参考地图,共计646幅其中,标准地图20幅,包括中文版中国地图6幅、英文版中国地图14幅,参考地图626幅。
  • 刚入职的员工不想去上班(刚入职一个新公司)
  • 2024-11-06刚入职一个新公司前两天在朋友圈看见一条招聘信息:汽贸公司招出纳,而且位置离家也不太远,就试着拨了个电话简单地问了下情况双休,上班时间卡得不严,八点半上班,干完活了,下午五点多可以去接孩子我一听,这简直就是给我准备的呀。
  • 四川希望汽车职业学院教务处官网(四川希望汽车职业学院)
  • 2024-11-06四川希望汽车职业学院高三的学子们明天就要踏上征途了说实在的小编此刻也挺紧张也不知送上什么祝福就愿你们春风得意马蹄疾一日看尽长安花别松手继续划后面更精彩哦十年寒窗只为今朝一战台上十分钟台下十年功这句话放在明天踏上高考的学子。
  • 顺着沿河小道往沙洲方向走(那路随着河流转出大山去)
  • 2024-11-06那路随着河流转出大山去穿行于兴山到神农架的山山岭岭之间,一条公路盘来绕去,缓缓地向山外伸展把目光收回来,就看见了一条河流,就在山间流淌着又过了好久,向外望去,那条河仍在,忽然明白,这条公路就是沿着河修的,这样一来,有水声相。