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

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

rust编程实战(rust编程知识拾遗Option学习)

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-06-02从明朝末期热兵器发展瓶颈历史上,明朝是中国各朝代中将科技水平发展到了巅峰了朝代,但后期跟西方的火器的发展历程对比,差距越来越大,到清朝时期,火器技术更是停滞不前,以至于被西方列强用火炮破开了国门科技的发展不能只局限于科技史本。
  • 遥控大师使用教程(电视遥控器app推荐)
  • 2024-06-02电视遥控器app推荐现代人家里的电器越来越多,从电视、机顶盒、空调、风扇、音响到电视盒子等,基本是每个电器都会配备对应的遥控器,遥控器的数量多了后也比较占用家里的地方,而且遥控器长时间使用后难免会出现损坏的情况,重新购买。
  • 标致408,1.2T怎么清洗节气阀(多长时间清洗一次节气阀合适)
  • 2024-06-02多长时间清洗一次节气阀合适节气门一般3万公里需要清洗一次,具体要根据行车环境灰尘严重程度来定,正常情况不清洗也可以的节气阀清洗方法:(1)将固定的金属束环上一点油,以免在拆卸的时候发生滑牙的现象拆下节气门软管金属束环,将软管拆。
  • 多肉植物的养殖方法和浇水(怎么养殖多肉植物好)
  • 2024-06-02怎么养殖多肉植物好花盆的选择是很重要的,花盆不需要特别的大,但需要注意的是花盆需要透气性好,这样可以避免积水一般只要时不时给多肉照射早上的阳光就可以了,这样可以促进多肉植物的生长因为多肉植物普遍对水分的需求不高,一般选。
  • 魔兽世界60级联盟防战饰品 魔兽世界收藏特刊第015期
  • 2024-06-02魔兽世界60级联盟防战饰品 魔兽世界收藏特刊第015期哈喽小伙伴们大家好,欢迎收看收藏特刊第012期,我是小编凉酒,每日更新关于魔兽世界收藏品(坐骑、玩具、外观、小宠物)的攻略,喜欢休闲收藏喜欢魔兽世界的赶快关注我吧!这一期以及之后的一期我们给大家介绍职。
  • 初期有8个征兆说明你怀孕了(女性必知的6个怀孕征兆)
  • 2024-06-02女性必知的6个怀孕征兆妊娠反应误以为肠炎女性必知的6个怀孕征兆安宁16岁女生小洁(化名)遭邻居侄子性侵,由于不懂生理卫生知识,将妊娠反应误认为是肠胃炎,其父亲看着女儿脸瘦肚大,以为她得怪病,去医院检查才知已怀孕28周,现面。
  • 残唐十大猛将排行榜(唐末第一猛将天下无敌)
  • 2024-06-02唐末第一猛将天下无敌在中国的古代,烽烟四起,朝代更迭,为此也涌现出了一大批力大无穷的猛将,其中我们最为熟悉的或许就是李渊的三儿子李元霸了,此子号称隋唐第一猛将,在当时无人能敌,可惜却智商短路,被自己的大铁锤给砸死了不过这。
  • 月食之后的天空(月食的时候星光依旧灿烂)
  • 2024-06-02月食的时候星光依旧灿烂不是月圆的时候,就是完美;不是月食的时候,才有残缺月亮逃不脱阴晴圆缺的轮回,人生逃不脱悲欢离合的宿命一钩残月,勾起的的不仅仅是凄凉和忧伤忧伤也未必不是一种美丽无限苍穹中,一切都那么渺小、短暂但万事万物。