rust编程实战(rust编程知识拾遗Option学习)
rust编程实战(rust编程知识拾遗Option学习)
2024-11-08 05:02:34  作者:皆是戏一场  网址: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));,
  • 生命重于泰山电视专题片2022 电视专题片生命重于泰山
  • 2024-11-08生命重于泰山电视专题片2022 电视专题片生命重于泰山来源:央视网原标题:电视专题片|《生命重于泰山》编者按:人民至上、生命至上党的十八大以来,以同志为核心的党中央高度重视安全生产工作,亲自指挥、亲自部署,强调要牢固树立安全发展理念,坚持人民利益至上,始。
  • 走进西昌感受人生(大美凉山见证巨变)
  • 2024-11-08大美凉山见证巨变6月30日,“探访中国凉山·安宁河现代农业硅谷”主题采访活动正式启动20余家中央、省级主流媒体首站走进西昌市西昌境内的安宁河畔,依托河谷内得天独厚的光热资源,已发展成为全省品质优、成熟晚、面积大的葡萄。
  • 沈阳历史上的故事(沈阳故事满族的由来)
  • 2024-11-08沈阳故事满族的由来“喜鹊”吐红果(苏子河水冲石)库布里雍顺——满族来源于长白山这是一篇美丽的古代神话传说故事,是发生在原始渔猎氏族社会时代故事的主人公库布里雍顺(满语,意为“山上英雄”)出生在依靠打猎为生的家庭,而他下。
  • 两种商业模式类型分别是什么
  • 2024-11-08两种商业模式类型分别是什么B2B,企业对企业的简称,是指企业对企业的交易模式,交易双方都是商家和阿里巴巴平台一样,是最典型的B2B平台B2C,企业对客户的简称,是指企业对个人的交易模式常见的B2C平台如JD.COM商城、天猫商。
  • 祝发财的祝福语
  • 2024-11-08祝发财的祝福语祝你能够发财,希望你发财以后,给自己买很多漂亮的衣服,让你每天都开开心心的,这是我这辈子最想看到的,真的希望你能够发大财。
  • 作文素材积累感恩名人名言(作文素材积累描写)
  • 2024-11-08作文素材积累描写好词感德感激感铭感念感纫感谢光宠洪恩眷眷开恩叩谢霖雨领情镂心面谢铭感铭刻铭佩铭心难忘人情纫佩神驰衔恩谢词谢恩谢客谢礼谢幕谢帖报偿报答报德报还报效报谢璧谢补情不忘酬报酬劳垂思春晖答礼道劳道谢电谢多谢恩宠。
  • 葳字取名寓意(葳字取名寓意是什么)
  • 2024-11-08葳字取名寓意是什么「源葳」(yuánzhē)源字意为原字仿本义是指水流开始的地方后引申指事物的来源「桦葳」(huàzhē)桦字意为木名桦木属植物的泛称「友葳」(yǒuzhē)友字的含义是指朋友、交好、相聚、帮助等庭葳」。
  • 脸上总是长痘应该注意什么(脸上长痘不要慌)
  • 2024-11-08脸上长痘不要慌跟着豆玉颜学护肤内调外养超简单,大家好我是豆玉颜小掌柜姐姐,很早之前看过一个脑筋急转弯,问痘痘长在哪里让你最不担心?想到答案了吗?对,长在别人的脸上,最不让自己担心,因为和自己没关系!但是痘痘一旦长在。
  • 厚脸皮是一种高情商(厚脸皮才是真强大)
  • 2024-11-08厚脸皮才是真强大很多人都有一个问题,就是脸皮太薄,不敢在人前表现自己,也不敢大声说话,还这也不好意思,那也不好意思,结果失去了很多好的机会,同时也没能让自己的才能真正发挥出来其实,做人脸皮一点要厚一点,不要怕这怕那,。
  • 梦到牙掉了(梦到牙掉了什么意思)
  • 2024-11-08梦到牙掉了什么意思梦见牙齿掉了好多,预示梦者近期的人际关系会很顺利未成年人梦见牙齿掉了好多,预示梦者近期健康方面不佳,喉部有可能会发炎,尽量不要吃上火的东西单身男女梦见牙齿掉了好多,预示梦者近期爱情方面不佳,对恋人的控。