rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-22 03:36:17  作者:皆是戏一场  网址:https://m.xinb2b.cn/sport/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关于海洋牧场建设等西海岸新区出台《渔业产业发展规划》《海洋牧场建设规划》到2025年,建成500多个深水网箱总数量达500多个,建设大型养殖工船1-2艘;建成50艘规模的现代化、专业化、功能配套完善的远洋船队;重点打造。
  • 盘点五位爱国态度最刚的年轻艺人 他因爱国言论遭香港封杀
  • 2024-11-22盘点五位爱国态度最刚的年轻艺人 他因爱国言论遭香港封杀本文属个人原创,禁止任何媒体转载!欢迎分享到朋友圈梁烈唯是影视剧中最帅的狙击手,也是网友眼里公认三观最正的演员,然而,最近却遭遇尴尬,面临失业的梁烈唯连发两条微博求工作默认太太有喜的梁烈唯,称要努力挣。
  • 数学辅助线作垂线中考题(初一数学7.2垂线)
  • 2024-11-22初一数学7.2垂线垂线是中考数学中常常出现的题型,“垂线段最短”是平面几何中的一个重要定理,应用比较广泛,对于这一节的知识点,同学们需要掌握的是:1.理解垂线、垂线段的概念,会用三角尺或量角器过一点画已知直线的垂线;(。
  • 山东省红色故事讲解大赛启动(早安山东红动齐鲁)
  • 2024-11-22早安山东红动齐鲁2019.09.22早安山东您的新闻资讯早餐齐鲁网9月22日讯今日白天到夜间,全省天气多云间晴北风,半岛地区4~5级阵风6~7级,其他地区3~4级阵风5~6级最高气温:半岛北部沿海地区23℃左右,其他。
  • 端宗赵昰怎么读(宋端宗赵昰)
  • 2024-11-22宋端宗赵昰姓名:赵昰拼音:zhaoshi(4-4)年号:景炎庙号:宋端宗谥号:裕文昭武愍孝皇帝出生年:公元1269年逝世年:公元1278年出生地:临安府(今浙江省杭州市)逝世地:临安府(今浙江省杭州市)在位时间。
  • 冰岛地理位置(冰岛在哪里)
  • 2024-11-22冰岛在哪里冰岛位于北大西洋北部,美洲板块和欧洲板块的交汇处,是北大西洋中的一个岛国冰岛可以看到极光,非常的美丽还有很多探险队会到冰岛去探险需要注意,如果你到冰岛旅游,一定要注意时差问题冰岛国土面积为10.3万平。
  • 你知道的越多就越有智慧(为什么你知道得很多)
  • 2024-11-22为什么你知道得很多来源:正心正举公众号文丨郭茵·主播丨苏木信息、知识,在这个时代越来越易得当你不了解某个知识,上网百度或者知识付费,分分钟“涨知识”;当你没有时间读书学习,听书、读书平台任你选,“碎片”时间也能增值然而。
  • 社保卡没办影响以后退休金吗(社保卡到期是否影响领退休工资)
  • 2024-11-22社保卡到期是否影响领退休工资​【读者求助】市民杨先生向本报记者求助,他母亲的社保卡快到期了,他想问问怎样更换?去哪里更换?“最近,不少市民的社保卡即将到期,但不知道如何更换另外,我的母亲退休了,工资都在社保卡上发放我们想知道卡号。
  • t8联考最后一题(范文分享T8第二次联考)
  • 2024-11-22范文分享T8第二次联考#高考作文##距离高考还有68天#欢迎来到模考作文精选,今天给大家带来的是T8第二次联考的范文,作文材料着眼于两位作家的名言,都有一定的思辨性和难度,错过解析的同学可以看往期文章:「作文快评」2022。
  • 张伯伦单场砍下100分回放(张伯伦100分科比81分乔丹69分)
  • 2024-11-22张伯伦100分科比81分乔丹69分任何得分,都不能只看数字,否则,NBA和篮球比赛只会变成一个纯数字的游戏在NBA各项规定中,对各项数字之间的制约关系,特别是团队和个人数据之间的制约关系也看得特别重论到NBA单场得分纪录,张伯伦的单场。
  • 玉石怎样鉴别真假(玉石的鉴别方法真假)
  • 2024-11-22玉石的鉴别方法真假玉石的鉴别方法真假1、滴水法将水滴在玉石上面,如果水滴能够像露珠一样不散开的话,则说明该玉是真玉,反之如果水滴很快就流失的话,则说明该玉为假玉2、冰凉润滑用手摸一摸玉石,如果摸起来很冰凉润滑的话,则说。