Rust 知识积累(6) - 行业资讯 -

当前位置:首页  >  行业资讯  > 正文

Rust 知识积累(6)

Rust 知识积累(6)
2023-04-20 22:08:22 来源:博客园
  • impl Trait


    【资料图】

    • 使用(与泛型类似)

      // 入参 举例// 类似与 fn prints_it>(input: T){}fn prints_it(input: impl Into + std::fmt::Display){    // 直接输出入参    println!("{}", input);}fn main(){    // c_str    prints_it("hi");    // String    prints_it(String::from("Hi"));}
  • 闭包

    在我理解。。。类似于反射的声明,然后在这个声明中调用该类的方法,期间该方法与其他代码相互独立

    // 使用impl声明一个闭包 FnMut(i32) 得到的就是numberfn returns_closure(input: &st)->impl FnMut(i32)->i32{    match input{        // 判断input是否为double,如果是则传入的number加2        "double" => |mut number|{            number += 2;            number        }    }}fn main(){// 调用    let mut doubles = returns_closure("double");    doubles(10);}
  • Arc 原子引用计数器

    线程或同时运算时保持原子性的类型

    // 引用Arc和Mutex包use std::sync::{Arc, Mutex};fn main(){    // 声明原子计数    let my_number = Arc::new(Mutex::new(0));    // 声明一个数组    let mut handle_vec = Vec![];     // 从0开始循环    for _ in 0..2{        let my_number = Arc::Clone(&my_number);        let handle = std::thread::spawn(move || {            for _ in 0..10{                *my_number.lock().unwrap() += 1;            }        });        handle_vec.push(handle);    }    handle_vec.into_iter().for_each(|handle| handle.join().unwrap());    // 结果为20    println!("{:?}", my_number); }
  • Channels

    通道,类似于socket连接时,一个是发送端,一个是接收端一样

    // 生产者和消费者需要绑定在一起pub fn channel()->(Sender, Recever)// 声明use std::sync::mpsc::{channel, Sender, Receiver};let (s, r):(Sender, Receiver) = channel();// 简写use std::sync::mpsc::channel;let (sender, receiver) = channel();sender.send(5);receiver.recv();//线程中使用use std::sync::mpsc::channel;fn main() {    let (sender, receiver) = channel();    let sender_clone = sender.clone();    // 使用线程向管道中发送一条信息    std::thread::spawn(move|| {         sender.send("Send a &str this time").unwrap();    });// 通过克隆的参数向管道中发送一条信息    std::thread::spawn(move|| {         sender_clone.send("And here is another &str").unwrap();    });    // 打印接收内容内容    println!("{:?}", receiver.recv().unwrap());    // 如何同时打印两个信息    // 使用 let mut handle_vec = vec![];保存线程返回变量    // for _ in handle_vec{} // 遍历中使用receiver.recv().unwarp();可同时显示两个}
属性

以"# []"或"# ![]"声明的 例如:

"# [derive(Debug)]" 影响下一行代码

"# ![derive(Debug)]" 将影响整个空间

  • 写了没有使用的代码,仍然会编译

    // #[allow(dead_code)] 和 #[allow(unused_variables)]// struct 只是声明,没有使用#![allow(dead_code)]#![allow(unused_variables)]// 声明了很多不同的structstruct Struct1 {} struct Struct2 {}struct Struct3 {}struct Struct4 {}struct Struct5 {}fn main() {    // 声明了四个变量,编译器不会进行任何操作    let char1 = "ん";     let char2 = ";";    let some_str = "I"m just a regular &str";    let some_vec = vec!["I", "am", "just", "a", "vec"];}
  • 创建结构和枚举派生

    // 该声明以后,HoldsAString都可以使用#[derive(Debug)]struct HoldsAString {    the_string: String,}fn main() {    let my_string = HoldsAString {        the_string: "Here I am!".to_string(),    };    // 结果为:Here I am!    println!("{:?}", my_string);}
  • 配置

    "#[cfg()]"的意思是配置 ,例如"# [cfg(test)] " // 告诉编译器不要运行他们,除非是在测试"# [cfg(target_os = "windows")] " // windows环境下运行"# ![no_std]" // 不要引入std的标准库

Box

  • 使用Box时,可以把一个类型放在堆上而不是栈上

  • 可以将它作为智能指针使用

//1let my_box = Box::new(1); // This is Box let an_integer = *my_box; // this is i32//2struct List{ item: Option>,}impl List{    fn new() -> List{        List{            item: Som(Box::new(List{item: None})),        }    }}fn main(){    let mut my_list = List::new();}
  • Box包裹trait

    use std::error::Error;use std::fmt;#[derive(Debug)]struct ErrorOne;// Error带有Debug类型impl Error for ErrorOne {}// ErrorOne中重写了fmt方法impl fmt::Display for ErrorOne {    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {        // 向自身写入You got the first error!字符串        write!(f, "You got the first error!")     }}// 与ErrorOne类似#[derive(Debug)] struct ErrorTwo;impl Error for ErrorTwo {}impl fmt::Display for ErrorTwo {    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {        write!(f, "You got the second error!")    }}// 声明一个调用方法fn returns_errors(input: u8) -> Result> {     match input {        // 注意 将ErrorOne和ErrorTwo都进行了装盒        0 => Err(Box::new(ErrorOne)),         1 => Err(Box::new(ErrorTwo)),        // 当成功的时候返回该字符串        _ => Ok("Looks fine to me".to_string()),     }}fn main() {    // 声明了一个数组,并存储了三个数值    let vec_of_u8s = vec![0_u8, 1, 80];     for number in vec_of_u8s {        // 循环数组,根据不同的数值返回不同的结果        match returns_errors(number) {            Ok(input) => println!("{}", input),            Err(message) => println!("{}", message),        }    }}

默认值

  • Default::default()

    // 主要使用let default_i8 : i8 = Default::default();       // 0let default_str : String = Default::default();  // ""let default_bool : bool = Default::default();   // false// struct默认值#[derive(Debug)]struct Character {    name: String,    age: u8,    height: u32,    weight: u32,    lifestate: LifeState,}#[derive(Debug)]enum LifeState {    Alive,    Dead,    NeverAlive,    Uncertain,}impl Character {    fn new(name: String, age: u8, height: u32, weight: u32, alive: bool) -> Self {        Self {            name,            age,            height,            weight,            lifestate: if alive {                LifeState::Alive            } else {                LifeState::Dead            },        }    }}impl Default for Character {    fn default() -> Self {        Self {            name: "Billy".to_string(),            age: 15,            height: 170,            weight: 70,            lifestate: LifeState::Alive,        }    }}fn main() {    let character_1 = Character::default();    println!(        "The character {:?} is {:?} years old.",        character_1.name, character_1.age    );}

建造者模式

// 注意 mut self而不是&mut self// 改变自身的height,并返回自身fn height(mut self, height: u32) -> Self {       self.height = height;    self}// 调用Character::default().height(180)

Deref和DerefMut

  • 通过实现Deref,可以将智能指针视作常规引用来进行处理。

    use std::ops::Deref;impl Deref for MyBox {  type Target = T; // 类型标注后边会有介绍,可先忽略  fn deref(&self) -> &T { // 返回成员的引用    &self.0  }}assert_eq!(5, *y); // 事实上*y会被编译成 *(y.deref())
  • 使用new实例化,等返回self时只会返回Deref中的设置信息

    use std::ops::Deref;#[derie(Debug)]struct HoldsANumber(u8);impl Deref for HoldsANumber{    type Target = u8;    fn deref(&self)->&Self::Target{        &self.0    }}let my_num = HoldsANUmber(20);println!("{:?}", *my_num + 20)// 标准库实例use std::ops::Deref;struct DerefExample{    value:T}impl Deref for DerefExample{    type Target = T;    fn deref(&self) -> &Self::Target{        &self.alue    }}fn main(){    let x = DerefExample{ value:"a"};    assert_eq!("a", *x);}
  • checked_sub() 安全的减法,整数可直接使用,如果失败返回None,不会崩溃

  • DerefMut 与Deref使用基本一致,唯一的不同是有了Mut,意味着可修改,使用前必须引用和实现Deref

    use std::ops::{Deref, DerefMut};struct HoldsANumber(u8);impl HoldsANumber {    fn prints_the_number_times_two(&self) {        println!("{}", self.0 * 2);    }}// 使用DerefMut之前必须先声明Derefimpl Deref for HoldsANumber {    type Target = u8;    fn deref(&self) -> &Self::Target {        &self.0    }}// 这个因为使用了Deref,因此不需要输入:Target = u8;impl DerefMut for HoldsANumber {     fn deref_mut(&mut self) -> &mut Self::Target {        &mut self.0    }}fn main() {    let mut my_number = HoldsANumber(20);    *my_number = 30;    println!("{:?}", my_number.checked_sub(100));    my_number.prints_the_number_times_two();}

Create和模块

// 声明一个modmod print_things{    use std::fmt::Display;    //必须加pub    pub fn prints_one(input: T){        println!("{}", input);    }}fn main(){    use create::print_thines::prints_one;    prints_one(6);   }

标签:

(责任编辑:news01)
中源家居(603709):4月19日技术指标出现观望信号-“黑三兵”

中源家居(603709):4月19日技术指标出现观望信号-“黑三兵”

资金流向数据,主力资金净流出105 18万元,占总成交额-24%,其中超大单净流入0 00元,大单净流出105
04-19 10:13:56
全球热讯:比喻句的例子一年级简短(比喻句的例子)

全球热讯:比喻句的例子一年级简短(比喻句的例子)

一、题文普通句改比喻句的例子,多点,二、解答1、那个人很瘦 比喻句------那个人骨瘦如柴 2、那个人很...
04-19 09:55:05
万胜智能(300882)4月18日主力资金净买入399.89万元

万胜智能(300882)4月18日主力资金净买入399.89万元

截至2023年4月18日收盘,万胜智能(300882)报收于19 59元,下跌4 35%,换手率13 46%,成交量7 76万手,成交额1 51亿元。
04-19 09:30:14
湘潭高新区17个产业项目集中开竣工投产

湘潭高新区17个产业项目集中开竣工投产

湘潭高新区17个产业项目集中开竣工投产总投资65 2亿元4月18日,湘潭高新区17个重点产业项目集中开工、...
04-19 08:58:32
红了樱桃 富了农家

红了樱桃 富了农家

暮春时节,保定市清苑区白团乡樱桃种植基地的大棚里,鲜嫩饱满的樱桃挂满枝头,在绿叶的映衬下,煞是好...
04-19 08:48:05
全球讯息:《爱很美味》“跨媒介” 如何原汁原味?|文艺评论

全球讯息:《爱很美味》“跨媒介” 如何原汁原味?|文艺评论

拍剧版时,三位演员对人物有从陌生到熟悉的过程,而拍摄影版时,她们已经非常贴近角色,私底下也成为真...
04-19 08:11:55
五叶绞股蓝图片_五叶绞股蓝

五叶绞股蓝图片_五叶绞股蓝

1、五叶绞股蓝主要功效是降三高,改善睡眠的其可以抗衰老,排毒养颜。2、美容等作用九叶蓝就是采摘五叶...
04-19 07:59:18
当前动态:美股三大股指收盘涨跌不一 大型科技股多数下跌

当前动态:美股三大股指收盘涨跌不一 大型科技股多数下跌

证券时报网讯,当地时间18日,美股三大股指收盘涨跌不一,截至收盘,道指报33976 63点,下跌0 03%;标普500指
04-19 07:39:45
脑部有血栓怎么治疗_脑血栓怎么治疗

脑部有血栓怎么治疗_脑血栓怎么治疗

1、脑血栓在医学上称为脑血栓,是指脑动脉粥样硬化,导致脑血管狭窄、闭塞,出现急性脑缺血症状和体征,...
04-19 07:18:03
美媒:苹果用高息加入“储户争夺战”,用户1年可享4.15%利息

美媒:苹果用高息加入“储户争夺战”,用户1年可享4.15%利息

【环球时报综合报道】彭博社17日报道称,苹果公司与高盛集团当天联手推出一款高利息储蓄账户服务,希望...
04-19 07:04:32
原神味噌汤食谱怎么获得

原神味噌汤食谱怎么获得

在原神游戏中有各种不同的菜谱,其中原神味噌汤是一个一星的食物,能
04-19 06:24:15
实力领潮,出色登场!nova 11系列及全场景新品发布会亮相上海 全球聚焦

实力领潮,出色登场!nova 11系列及全场景新品发布会亮相上海 全球聚焦

AITO问界M5系列华为高阶智能驾驶版正式上市,成为首个同时搭载HUAWEIADS2 0⾼阶智能驾驶系统和鸿蒙智能...
04-19 06:04:35
干锅蟹做法麻辣香锅?

干锅蟹做法麻辣香锅?

食材:改好刀的蟹750克,葱姜汁、料酒、高汤各适量,食用油,罗汉笋条75克、鲜莴笋条50克、西芹条50克,...
04-19 05:36:16
天天视讯!建筑装饰工程技术专业介绍PPT(建筑装饰工程技术专业介绍)

天天视讯!建筑装饰工程技术专业介绍PPT(建筑装饰工程技术专业介绍)

建筑装饰工程技术专业介绍PPT,建筑装饰工程技术专业介绍这个很多人还不知道,现在让我们一起来看看吧!1...
04-19 05:02:32
参公和公务员什么区别_请问参公是什么意思 与公务员有什么区别 环球看点

参公和公务员什么区别_请问参公是什么意思 与公务员有什么区别 环球看点

今天小编肥嘟来为大家解答以上的问题。参公和公务员什么区别,请问参公是什么意思与公务员有什么区别相...
04-19 04:48:53
【环球聚看点】象冢读后感_象冢

【环球聚看点】象冢读后感_象冢

1、传说中的象冢传说每一只预感到生命即将结束的大象,都会在有限的生命最后的几天走到丛林的深处,沿着象...
04-19 04:23:24
那不勒斯vsAC米兰前瞻:奥斯梅恩复出迎逆转?米兰后防遇大考!

那不勒斯vsAC米兰前瞻:奥斯梅恩复出迎逆转?米兰后防遇大考!

与联赛的磕磕绊绊相比,本赛季红黑军团在欧冠赛场上的表现则是颇为稳健,在1 8决赛双回合的比赛里正是...
04-19 03:56:43
安徽一季度缴存住房公积金同比增加13.6%

安徽一季度缴存住房公积金同比增加13.6%

安徽一季度缴存住房公积金同比增加13 6%,个贷,安徽,逾期率,购房贷款,住房公积金
04-19 03:24:54
环球热资讯!2023年4月18日A股深证成指查询,混合动力概念概念行情及资金流向查询

环球热资讯!2023年4月18日A股深证成指查询,混合动力概念概念行情及资金流向查询

2023年4月18日A股深证成指查询,混合动力概念概念行情及资金流向查询,2023年4月18日股市复盘:混合动力...
04-19 02:50:41
交警:骑电动自行车不要驾照!但要注意5点,避免被罚款,明确了

交警:骑电动自行车不要驾照!但要注意5点,避免被罚款,明确了

您在阅读前请点击上面的“关注”二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。电...
04-19 02:29:06
爱康国宾体检中心查询_爱康国宾体检中心

爱康国宾体检中心查询_爱康国宾体检中心

国内知名连锁健康体检服务品牌,主要为国人提供健康体检、疾病检测、私人医生等健康管理服务,主要涵盖...
04-19 02:04:29
天天新动态:4月18日基金净值:华夏科创板50ETF联接A最新净值0.8983,跌0.85%

天天新动态:4月18日基金净值:华夏科创板50ETF联接A最新净值0.8983,跌0.85%

4月18日,华夏科创板50ETF联接A最新单位净值为0 8983元,累计净值为0 8983元,较前一交易日下跌0 85%...
04-19 01:35:20
北京天空湛蓝,怀柔怀九河美成了童话世界 每日热闻

北京天空湛蓝,怀柔怀九河美成了童话世界 每日热闻

北京天空湛蓝,怀柔怀九河美成了童话世界
04-19 01:30:06
热推荐:2023年五一节成都哪些水上乐园开业了?

热推荐:2023年五一节成都哪些水上乐园开业了?

成都环球中心水上乐园营业时间:2023年4月29日-5月3日全天10:00-20:00,18:00停止入场(以现场为准)连续...
04-19 01:17:21
4月18日东吴裕盈一年持有混合A净值下跌0.23% 全球时快讯

4月18日东吴裕盈一年持有混合A净值下跌0.23% 全球时快讯

4月18日,截至收盘,东吴裕盈一年持有混合A(970043)较前一交易日净值下跌0 23%,跑输上证指数,单位...
04-19 00:52:44
[浦东]香山中学:携手共建,聚力发展——学校签约成为上海大学上海美术学院“美育推广基地”

[浦东]香山中学:携手共建,聚力发展——学校签约成为上海大学上海美术学院“美育推广基地”

4月17日上午,上海大学上海美术学院“美育推广基地”签约、授牌会议在香山中学一楼会议室顺利举行。会议...
04-19 00:11:48
3月份民航业完成旅客运输量4570万人次 运输生产恢复态势总体平稳_世界热推荐

3月份民航业完成旅客运输量4570万人次 运输生产恢复态势总体平稳_世界热推荐

央视网消息:记者今天(4月18日)从民航局新闻发布会上了解到,3月份,民航全行业完成运输航空飞行93 8...
04-18 23:48:25
理想汽车:第一款纯电动汽车将成为首款搭载宁德时代4C麒麟电池的量产车型 全球即时看

理想汽车:第一款纯电动汽车将成为首款搭载宁德时代4C麒麟电池的量产车型 全球即时看

4月18日,理想汽车在港交所公告,与宁德时代达成全面战略合作协议。公司目前预计其第一款纯电动汽车将成...
04-18 23:25:52
7000mAh超大电池仅1799元!华为畅享60X图赏|天天亮点

7000mAh超大电池仅1799元!华为畅享60X图赏|天天亮点

7000mAh超大电池仅1799元!华为畅享60X图赏
04-18 23:25:07
美副总统官邸附近传出枪声!红绿灯顶部被打碎,无人受伤

美副总统官邸附近传出枪声!红绿灯顶部被打碎,无人受伤

中新网4月18日电据美国全国广播公司(NBC)报道,当地时间17日,位于华盛顿的美国海军天文台附近传出枪声...
04-18 22:49:14

为您推荐

精彩推送