rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-22 12:18:16  作者:皆是戏一场  网址:https://m.xinb2b.cn/life/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-22孔子为什么要见南子孔子一直以来都被称为圣人,不仅在我国,在国际上也是一个知名人士不过,这样一个圣一般的人物,也有一些让人说不清道不明的地方,其中比较出名的就是孔子与南子的一次会面,这个南子是一个女子,后世对她的评价实在。
  • 自媒体短拍摄技巧器材篇(自媒体短运营必看)
  • 2024-11-22自媒体短运营必看作为一枚短视频新手小白,你肯定遇到过这些问题:短视频应该剪什么内容呢?短视频的素材应该怎么找呢?别急,今天小编给大家分享一些大佬总结的,短视频运营必备的素材库,让你再也不为短视频素材发愁:01微博首先。
  • 白雪公主万年青有毒吗(白雪公主万年青有没有毒)
  • 2024-11-22白雪公主万年青有没有毒白雪公主万年青有毒吗:白雪公主万年青也叫白柄粗肋草,它全株有毒,不可误食,误食的话会引起口舌发炎、胃痛、腹泻等,应立即就医所以养的时候一定要小心了白雪公主万年青怎么养:(1)光照管理:白雪公主万年青喜。
  • 30天如何备考公务员上岸(备考公务员小妙招)
  • 2024-11-22备考公务员小妙招一年一度的国家公务员考试、各省的公务员考试又将拉开帷幕,作为应届高校毕业生的热门首选,如何从千军万马中脱颖而出,这些备考公务员“小妙招”请认真记下,或许对你考公会有帮助一、关于如何备考公务员考试,考两。
  • 国产比较虐心电视剧(请国产烂剧放过)
  • 2024-11-22请国产烂剧放过内娱拍不好职业剧,已是公认的事实三百六十行,行行被霍霍要说哪个职业被魔改得最惨,那必然是「医生」古装、现代全部乱拍一通不仅让专业人士怨声连连就连普通观众也能看出一大堆硬伤:「医疗剧拍成科幻剧」「编剧真。
  • 无心法师3小说结局(无心独自离开了)
  • 2024-11-22无心独自离开了结局中无心独自离开了无心抱着白琉璃附身的猫来到一家客栈,仔细看着装了关于这一百年来的记忆的行李箱,交代白琉璃一定要将月牙的物品给他看,因为他一定要记得月牙与他之间的故事,之后睡去白琉璃不忍无心再记起那。
  • 魔兽世界怀旧服灰烬使者伤害(魔兽世界怀旧服)
  • 2024-11-22魔兽世界怀旧服展望未来,怀旧服中纳克萨玛斯也快要开放了一个问题油然而生,那就是堕落的灰烬使者是否值得入手?毫无疑问,这是一把可以跟霜之哀伤媲美的神器,已经不用再解释了!另一方面,堕落的灰烬使者外观也是无人能及的,绝。
  • 虎皮兰怎么养容易更茂盛(春季养虎皮兰的正确方法)
  • 2024-11-22春季养虎皮兰的正确方法到了春天,您的虎皮兰现在开始生长了吗?如果您的虎皮兰长势弱叶片瘦,到了春天一定要掌握好正确的方法,养护得当了才能够让您的虎皮兰长满新芽,老叶肥厚硬挺,今天就来给大家说一下三点1,搬动位置我们冬天的时候。
  • 斗鱼乔碧萝原来的直播:乔碧萝遭斗鱼封杀后
  • 2024-11-22斗鱼乔碧萝原来的直播:乔碧萝遭斗鱼封杀后hello~大家好,我是敢哥相信前段时间,很多网友听说过乔碧萝事件了,乔碧萝是斗鱼旗下的主播,因直播意外给众多网友们表演了一场“萝莉变大妈”,瞬间轰动了整个直播界,而后乔碧萝又成了热点新闻,可以说很多。
  • 竹芋为什么叶子尖发黄干尖(竹芋为什么叶子会尖发黄干尖)
  • 2024-11-22竹芋为什么叶子会尖发黄干尖强光暴晒:竹芋的叶子尖发黄干尖,可能是强光暴晒的原因,直射光会灼伤叶子,出现晒斑,引起叶尖发黄干尖空气干燥:也可能是空气干燥的原因,叶子随着发干浇水不当:还可能是浇水不当的原因,长期浇水不足或浇水过多。
  • 公交车刷卡的机器是什么(公交车刷卡的机器叫什么)
  • 2024-11-22公交车刷卡的机器叫什么公交上刷卡的设备叫公交刷卡机,也称车载刷卡机,是一种常用的公交收费设备,一般支持刷IC卡、手机扫码、人脸识别刷脸和人体测温(支持微信、支付宝、云闪付)等功能,扫码支付1秒内响应,再结合大数据技术和云计。