rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-09-29 01:40:53  作者:皆是戏一场  网址:https://m.xinb2b.cn/know/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好吃的下饭菜外婆菜炒鸡蛋打4个鸡蛋加一小撮盐,搅拌均匀4大勺外婆菜洋葱和蒜苔都切丁,小米辣切小段锅中倒油,加热倒入鸡蛋鸡蛋炒熟,用铲子切成小块,盛出洗干净的锅中再倒油,油热后放入小米辣,炒香加入外婆菜,炒出香味加入洋葱,翻炒。
  • 氢能源爆发时间(未来能源的主角会是)
  • 2024-09-29未来能源的主角会是●如果制氢实现清洁环保可持续,那么氢能的生命周期将是一个清洁环保的闭环●氢能可将太阳能、风能等不稳定的可再生能源储存起来,是一种优秀的储能介质●氢燃料电池系统是目前已知的氢能最佳利用方式氢能是氢在物理。
  • 理想之城77集解读 理想之城中的小北咋这么穷
  • 2024-09-29理想之城77集解读 理想之城中的小北咋这么穷在孙俪、赵又廷、于和伟主演的电视剧《理想之城》中,孙俪扮演的苏筱的闺蜜吴红玫,后来跟相恋9年、已经谈婚论嫁的男朋友张小北分手了沉迷于打游戏中的小北终于醒过味儿来,他顾不上穿鞋子,拔腿追赶吴红梅乘坐的出。
  • 头顶长尖冠的鸟是什么鸟(这只头戴凤冠的鸟是什么鸟)
  • 2024-09-29这只头戴凤冠的鸟是什么鸟武汉晚报讯(记者陈奇雄)一只头戴漂亮凤冠的水鸟,在汉江中游动觅食,有时会在水中潜行几十秒钟才浮出水面换气12月14日,家住武汉市汉阳区的关艾,在拍下其影像资料后问:它是只什么鸟?凤头鸊鷉在汉江晴川桥水。
  • steam虚幻4游戏推荐 粉丝用虚幻4重制黑暗之魂不死镇关卡
  • 2024-09-29steam虚幻4游戏推荐 粉丝用虚幻4重制黑暗之魂不死镇关卡近日,Youtube上有一名叫做“EsinReborn”的博主发布了一段视频,视频中他展示了用虚幻4引擎重制的《黑暗之魂》中的不死镇关卡并且与其他粉丝的重制版本不同的是,该版本还具有一些基本的游戏元素。
  • cf挑战强化武器活动(CF一锤定音奖励太真实)
  • 2024-09-29CF一锤定音奖励太真实穿越火线昨日又开启了新的一期一锤定音活动,奖励和上期一样,说好的新内容首发呢?相信大家除了超级背包和护目镜,就想要百万点券了,但小编提醒大家别上头,这都是给“狗托”准备的本期一锤定音截至月底,但奖励和。
  • 上海哪个花海最好(沪郊花开海上生态园恢复开放)
  • 2024-09-29沪郊花开海上生态园恢复开放新华社客户端上海5月24日电(李荣殷洁如)“提前预约好过来,入口处测温扫码购票,挺快的孩子已在儿童乐园疯玩一圈了,现在去找块绿地搭个帐篷休息会儿有点小雨,但不影响心情”24日,是沪郊朱泾镇“花开海上”。
  • 大通皮卡t70真实使用感受(颠覆对皮卡的认知吧)
  • 2024-09-29颠覆对皮卡的认知吧咱们现在认识的乘用轿车、SUV、旅行车有很多,不过你认识的皮卡有几款?可能很多人都会说,“我平常又不会用到皮卡,不需要去了解它们”是的,一方面,过往皮卡具有非常强的工具属性,若不是工程建筑、批发零售、。
  • 华侨大学是211吗(华侨大学相关介绍)
  • 2024-09-29华侨大学相关介绍华侨大学不是211大学,该校是中国第一所以华侨命名的高等学府,是国侨办与福建省、泉州市、厦门市共同建设的综合性大学,被中共中央确定为国家重点扶植的大学华侨大学1960年创办于著名侨乡福建省泉州市,是周。
  • 按压式洗面奶如何打开(按压式洗面奶怎么打开)
  • 2024-09-29按压式洗面奶怎么打开为避免出现洗面奶漏出的问题,按压式的洗面奶用的都是伸缩杆封装要打开洗面奶,先解开洗面奶的包装,把洗面奶的按压头往反方向扭转两圈,之后伸缩杆会自动弹出来,向下按压可挤出洗面奶按压式的洗面奶多为洁面泡沫类。
  • 囊萤夜读车胤是个什么样的人(囊萤夜读话车胤)
  • 2024-09-29囊萤夜读话车胤车胤囊萤夜读晋代是一个社会风气比较颓废的时代,但颓废的晋代却留下了“闻鸡起舞”、“囊萤夜读”、“孙康映雪”等多个很励志的成语典故其中出自《晋书·车胤传》的“囊萤夜读”,说的是东晋大臣车胤,年少时因家境。
  • 备孕缺锌对男性有什么影响(5种食物是精子助长剂)
  • 2024-09-295种食物是精子助长剂孩子是父母爱情的结晶,是小家庭的希望,每位宝宝的出生对于家庭来说都是非常幸福的一件事,怀孕前准爸爸准妈妈需要做诸多准备,不仅要及时调整饮食和生活作息,还要坚持运动锻炼,提升身体素质,特别是准爸爸,为了。