rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-23 01:08:07  作者:皆是戏一场  网址:https://m.xinb2b.cn/tech/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));,
  • 新长安35啥时候上市(长安深蓝发布全新品牌标志)
  • 2024-11-23长安深蓝发布全新品牌标志长安深蓝今天正式公布了该品牌的全新标志,与此同时,他们还宣布旗下首款车型的命名,称为“SL03”,也就是之前那款代号为C385的车型长安深蓝品牌标志长安深蓝SL03与此同时,工信部也刚好发布了长安深蓝。
  • 尹食堂朴叙俊最新(下季有望在瑞士开店)
  • 2024-11-23下季有望在瑞士开店上周五晚(12日)播出的《尹食堂2》收视比首集上升,并又再度创下高收视纪录,距离李瑞镇的第三季收视公约很接近,相信《尹食堂3》的制作成功在望囉~来到第二集,打工生朴叙俊继续展现他的热血魅力,而加入新菜。
  • 清除龟背上青苔最佳方法(怎么清除龟背上青苔)
  • 2024-11-23怎么清除龟背上青苔一般的来说,乌龟身上尤其是龟壳部分都是会长一些的水草,或者是青苔,这个都是比较正常的现象那么遇到这样的问题,如果是影响了乌龟的外表美观的话,我们所需要注意的问题其实就是需要去好好的注意这样的问题,首先。
  • 工业园区是否是公共场所(公共场所有序开放)
  • 2024-11-23公共场所有序开放5月16日上午,苏州工业园区发布了关于公共场所有序开放的通告17日起,工业园区将有序恢复堂食,苏州中心商场5月17日恢复营业商场、餐饮店做好了充分准备,今天再一次对相关场所消毒消杀,为明天做好准备,。
  • 大豆和脱脂大豆酿造酱油的区别(秒懂酱油一)
  • 2024-11-23秒懂酱油一导读酱油是家喻户晓的食品调味料,用传统方法酿造酱油的基本原料是大豆(黄豆),大豆富含蛋白质和脂肪(大豆油),还有碳水化合物、矿物质、维生素和抗营养因子那么,为什么用大豆酿造的酱油里没有油?酿造酱油酿造。
  • 汽车转向辅助是什么意思(汽车转向辅助是什么)
  • 2024-11-23汽车转向辅助是什么转向辅助系统是指当驾驶员转动方向盘时,其中一个灯泡亮起(个别汽车的转向辅助系统是雾灯),以辅助驾驶汽车照亮绕行的盲点,方向盘对准后,一侧的转向辅助灯将立即熄灭助力转向系统由机械转向系统加上转矩传感器等。
  • 超进化物语前期应该怎么玩(超进化物语怎么快速提升技能)
  • 2024-11-23超进化物语怎么快速提升技能《超进化物语》中的技能强化也是一门学问,要怎么才能快速升级技能属性,难倒了一片玩家今天小编就带大家来了解怎么强化技能每个怪物都有自己独特的一系列技能,一般来说绿色有1个技能,蓝色两个,紫色3个,橙色4。
  • 100种好看的花名(哪些作品一定能把人看哭)
  • 2024-11-23哪些作品一定能把人看哭当我们在看动漫作品的时候,往往会将自己的情绪代入到剧情当中如此一来,若是出现什么感人的剧情,那么也能够令我们忍不住泪流满面那么到底有哪些作品可以做到“一定能够把人看哭”呢?对此,近日有日本网友展开了讨。
  • 被误读的金瓶梅(被误读的金瓶梅)
  • 2024-11-23被误读的金瓶梅《金瓶梅》作为明代“四大奇书”之一,长期以来都处于是“禁书”的尴尬地位,跟同时期的三国、水浒、西游没法比也许很多人会简单粗暴地以为,就是因为金瓶梅讲的都是男欢女爱,会误导一众读者的身心健康甚至在一系列。
  • 结婚七年纪念日简短句子(在一起一周年纪念日感言说说)
  • 2024-11-23在一起一周年纪念日感言说说在一起一周年如何发个朋友圈说说?一起来和闽南网小编来看看结婚一周年寄语吧mua已共你一年记忆亦同样新鲜距离百年好合还有99年陪你走完第一个春夏秋冬朝暮与年岁并往我与你一同行至天光一周年合作愉快都一年了。