rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-09-29 06:22:58  作者:皆是戏一场  网址: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));,
  • 推荐吃冰瓜夏天比较解暑(夏天多吃凉瓜)
  • 2024-09-29夏天多吃凉瓜“夏天多吃瓜”,“夏季吃凉不吃寒”,所以夏季应该多吃“凉瓜”,少吃“寒瓜”在我们的中医理念中经常提到的“性寒”、“性凉”、“性温”等还是有讲究的,“寒瓜”虽然可以很好地清热消暑,但是女生生理期、脾胃虚。
  • 世界上最危险的旅游目的地之一(世界上最危险的目的地)
  • 2024-09-29世界上最危险的目的地1北永加斯也被称为“死亡之路北永加斯路被昵称为“死亡之路”雾气、山体滑坡、瀑布和每一个转弯都会下降610米的悬崖使得在这个69公里的折返处上下行驶非常危险2蛇岛巴西伊利亚达凯马达格兰德岛因其大量毒蛇而。
  • 阿胶不能和什么食物一起吃(哪些食物不能和阿胶一起吃)
  • 2024-09-29哪些食物不能和阿胶一起吃萝卜,阿胶不能与萝卜一起食用,萝卜顺气助消化,阿胶补气,两者同吃功效会抵消服用阿胶前后2小时内,忌吃萝卜浓茶,食用阿胶最后前后一小时不要喝浓茶,因为浓茶会影响阿胶的药效大蒜,阿胶不能和大蒜一起吃,食用。
  • 丈夫出轨妻子要离婚的小说(小说他们即将结婚)
  • 2024-09-29小说他们即将结婚清晨,东方刚刚露出鱼肚白,俞静雅踏出了叶北城的别墅她沿着海岸走了很长时间,直到遥远的天际冉冉升起一轮红日,才满足的转身,没有回家,直接去了公司今天她发现同事们看她的眼神都变得异样,以为是自己要嫁入豪门。
  • 姨妈巾真的不能乱用呀(想不到姨妈巾居然还有这些用处)
  • 2024-09-29想不到姨妈巾居然还有这些用处1、做鞋垫很多人买鞋时都有感觉大一号有点大,小一号有点紧,垫上一个姨妈巾就刚刚恰到好处,它比鞋垫都透气(尤其是夏天的鞋,垫鞋垫就太热了),还比鞋垫智能,想穿松一点的就垫薄的,想紧一点就垫厚的可以说用姨。
  • 带你走进董永七仙女文化园(重庆云阳第二高山)
  • 2024-09-29重庆云阳第二高山重庆市云阳县最高峰是云峰山野猪槽,海拔1809米,位于云阳北部的农坝镇而云阳第二高山,则是轿顶山,海拔1761米,位于上坝乡,同样是在云阳县北部轿顶山目前还是“待字闺中”,还没有进行大规模旅游开发,以。
  • 夫妻的真正感悟(夫妻生活感悟)
  • 2024-09-29夫妻生活感悟夫妻⽣活中的夫妻难免⼩吵⼩闹,都是正常的,虽然再吵再闹在外⼈看来哪也是幸福的!⽣活中的夫妻是⼼照不喧的,虽然吵闹着但在外⼈⾯前依然彼此关⼼呵护着!如此平凡的夫妻,你说能不幸福吗?只因⽣活是平凡的,所以。
  • 梦见女鬼是什么征兆(见女鬼是什么意思)
  • 2024-09-29见女鬼是什么意思梦见女鬼,有两种征兆:反映你自己感情上,受到伤害的过去代表你朋友,感情上受到伤害,对你产生的影响女鬼,是心理阴影,负面情绪.反映你自己感情上,是一种长期积累的消极情绪的化身,而不同的鬼有不同的象征意义。
  • 防晒霜怎样不搓泥(防晒霜为什么老搓泥)
  • 2024-09-29防晒霜为什么老搓泥搓泥的学名是乳化不均匀,产品里的粉体、胶、增稠剂都可能是导致搓泥的元凶,而具体会不会搓泥要看产品整体的配方、每个人皮肤的出油情况.....影响因素很多,因此很难说某个产品一定会或者不会搓泥,甚至可能是。
  • 石家庄直升重点小学的幼儿园 教育部官宣石家庄8所学校
  • 2024-09-29石家庄直升重点小学的幼儿园 教育部官宣石家庄8所学校日前,教育部公布了2021年度全国青少年校园足球特色学校和全国足球特色幼儿园名单,其中,石家庄8所中小学、13所幼儿园入选,快来看看有你家附近的吗?2021年度全国青少年校园足球特色学校名单(石家庄)。
  • 最安静的印第安男孩(那个因为翡翠项圈认识的姑娘)
  • 2024-09-29那个因为翡翠项圈认识的姑娘我想起有一款老翡翠项圈那是我设计的第一款老翡翠项圈那时,我用戴着它的照片做微信头像有一天早上,客服妹妹来说它被人拍了,我突然有点茫然失落,我发现我好像并没有想卖它....中午突然在微信上有个不熟的姑娘。