rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-07-05 01:49:00  作者:皆是戏一场  网址:https://m.xinb2b.cn/life/rkp447716.html

头条地址:https://www.ixigua.com/i6765442674582356483github地址:见【了解更多】,今天小编就来聊一聊关于rust编程实战?接下来我们就一起去研究一下吧!

rust编程实战(rust编程知识拾遗Option学习)

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-07-05适合高中生的学习方法与技巧提前预习把疑问处标出把你认为的重点标出课上认真听讲记重点、难点与自己预习对照完成作业作业要分类:基本的(理科就是套公式的)、灵活性的(灵活运用定理、公式的)、难的(自己费力解决的)把老师讲评作业时同学。
  • 鹌鹑取暖的正确方法(鹌鹑怎么取暖)
  • 2024-07-05鹌鹑怎么取暖一般是用一个小瓦数的灯泡点亮放在纸盒上方,注意不能离鹌鹑太近,因为灯泡长时间点亮产生热量也是有可能伤害鹌鹑的取暖时需要反复试验一下,到鹌鹑能忍受的温度即可但要注意水应该离灯远一点,以免发生事故。
  • 白种人自诩为一等人(总骄傲的称自己为黄种人)
  • 2024-07-05总骄傲的称自己为黄种人来源丨喜马拉雅FM东岳先生制作的精品课《王东岳的中西哲学启蒙课》编辑丨茂言文明的差异与人种是否有直接关系?我们一般提起文明,由于素质分化差异极大,很难想象人类会产生原始文化和文明的重大分野这就导致,人。
  • 大s在汪小菲面前的表现(从大S和汪小菲的离婚风波说起)
  • 2024-07-05从大S和汪小菲的离婚风波说起今天大S和汪小菲闹离婚的新闻登上了头条大S和汪小菲向来被称为娱乐圈的“模范夫妻”,大S是天秤座,情商很高;汪小菲是巨蟹座,婚后会比较重视家庭大S和汪小菲也是典型的明星和商人的结合,双方可以相互帮助,互。
  • 值得我们回忆的童年记忆(我们的童年真土)
  • 2024-07-05我们的童年真土人啊,刚还说着年轻呢,往往一夜之间就长大了成年人的世界里除了容易发胖和脱发,别的都不容易……工作压力,人际关系和操蛋的生活很轻易地就把一个个唇红齿白的清纯少年郎磨练成了满脑肥肠的油腻中年男在我们被生活。
  • 菠菜属酸性蔬菜还是碱性蔬菜啊(蔬菜档案叶菜类)
  • 2024-07-05蔬菜档案叶菜类蔬菜档案叶菜类(1)菠菜一、基本资料:中文名:菠菜学名:SpinaciaoleraceaL.别名:赤根菜、鹦鹉菜、菠薐菜、波斯菜等科属:藜科菠菜属分布:极常见的蔬菜之一,我国普遍栽培,原产伊朗用途:菠。
  • 你是我心目中的女朋友吗(是你的理想女朋友吗)
  • 2024-07-05是你的理想女朋友吗本视频发布已经过本人同意他们做过最伤你的事情是什么?骗我钱骗色可以不能骗钱?骗色也不行,但是就是不能骗我钱小姐是90后还是00后?自己是搞笑,你们觉得有这个潜力看男生的话一般是先看男生哪里,看脸你觉得。
  • 有没有一个人想忘忘不掉(有没有一个人让你念念不忘)
  • 2024-07-05有没有一个人让你念念不忘幸福是每个人的向往,什么是幸福在每个人心里都有不同的答案我是个平时不看电视剧的人,前段时间偶然看了一小段《幸福有多远》的视频,一下子被吸引住了讲述了20世纪80年代,烟厂女工梅婷‬扮演‬的李萍为追求自。