Rust精简核心笔记:第二波,语法精髓部分解锁

前面介绍了Rust精简比较第一波 Rust精简核心笔记:第一波,深入浅出语法精华-CSDN博客 把第二波整理如下,通过三波会把全部Rust核心、实用、最简练的语法整理出来,最高效掌握Rust。

Rust精简笔记(二)

  • Rust核心笔记第二波总结整理,第七部分: match控制流结构、第八部分: 泛型&Trait&生命周期,第九部分: 集合,第八部分也是rust语言精髓特性

  • 参考The Rust Programming Language & Rust in Action

七.match控制流结构

  • 前面第三部分流程控制里简单说明了match使用,结合enum来看看match的更多使用场景总结

  •  基础匹配语法:

    let number = 2;match number {1 | 2 => println!("1 or 2"), // 匹配到某一个3..=5 => println!("3到5"),  // 通过 ..= 匹配值的范围_ => println!("invalid"),    //未匹配到 _}
match 解构结构体:
struct Point {x: i32,y: i32,
}fn main() {let p = Point { x: 0, y: 7 };let Point { x: a, y: b } = p;assert_eq!(0, a);assert_eq!(7, b);
}
解构枚举:
enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}fn main() {let msg = Message::ChangeColor(0, 160, 255);match msg {Message::Quit => {println!("The Quit variant has no data to destructure.")}Message::Move { x, y } => {println!("Move in the x direction {} and in the y direction {}",x, y);}Message::Write(text) => println!("Text message: {}", text),Message::ChangeColor(r, g, b) => println!("Change the color to red {}, green {}, and blue {}",r, g, b),}
}
//打印结果到change the color....
解构嵌套的结构体和枚举:
enum Color {Rgb(i32, i32, i32),Hsv(i32, i32, i32),
}enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(Color),
}fn main() {let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));match msg {Message::ChangeColor(Color::Rgb(r, g, b)) => println!("Change the color to red {}, green {}, and blue {}",r, g, b),Message::ChangeColor(Color::Hsv(h, s, v)) => println!("Change the color to hue {}, saturation {}, and value {}",h, s, v),_ => (),}
}
用 .. 忽略剩余值:
//通过使用 .. 来忽略 Point 中除 x 以外的字段
fn main() {struct Point {x: i32,y: i32,z: i32,}let origin = Point { x: 0, y: 0, z: 0 };match origin {Point { x, .. } => println!("x is {}", x),}
}
Match guards:
  • • 匹配守卫(match guard)是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支

fn main() {let num = Some(4);match num {Some(x) if x < 5 => println!("less than five: {}", x),Some(x) => println!("{}", x),None => (),}
}
@绑定:
  •  运算符@,允许我们在创建一个存放值的变量的同时,测试其值是否匹配模式。即@ 可以在一个模式中同时测试和保存变量值。

fn main() {enum Message {Hello { id: i32 },}let msg = Message::Hello { id: 5 };match msg {Message::Hello {id: id_variable @ 3..=7, //使用id_variable变量配合@,以便此分支相关联的代码可以使用它} => println!("Found an id in range: {}", id_variable),Message::Hello { id: 10..=12 } => {println!("Found an id in another range")}Message::Hello { id } => println!("Found some other id: {}", id),}
}

八,泛型、Trait、生命周期

泛型:
  • 函数定义中使用泛型

fn largest<T>(list: &[T]) -> T {
}
//函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数的返回值类型也是 T
//类型参数声明位于函数名称与参数列表中间的尖括号 <>
  •  结构体定义中的泛型

struct Point<T> {x: T,y: T,
}fn main() {let integer = Point { x: 5, y: 10 };let float = Point { x: 1.0, y: 4.0 };
}
  • 枚举定义中的泛型

enum Option<T> {Some(T),None,
}enum Result<T, E> {Ok(T),Err(E),
}
  • 方法定义中的泛型

struct Point<T> {x: T,y: T,
}impl<T> Point<T> {fn x(&self) -> &T {&self.x}
}fn main() {let p = Point { x: 5, y: 10 };println!("p.x = {}", p.x());
}
Trait:
  •  通过 trait 以一种抽象的方式定义共享的行为,trait 类似于其他语言中的接口,但也不完全一样.

//定义 trait Summary ,定义summarize调取->summarize_author默认方法,达到调用默认行为,区分开实现trait的的定义
pub trait Summary {fn summarize_author(&self) -> String;fn summarize(&self) -> String {format!("(Read more from {}...)", self.summarize_author())}
}pub struct Tweet {pub username: String,pub content: String,pub reply: bool,pub retweet: bool,
}
//实现 trait Summary
impl Summary for Tweet {fn summarize_author(&self) -> String {format!("@{}", self.username)}
}fn main() {let tweet = Tweet {username: String::from("horse_ebooks"),content: String::from("of course, as you probably already know, people"),reply: false,retweet: false,};println!("1 new tweet: {}", tweet.summarize());
}
  •  trait 作为参数:

// 方法接收是实现了 trait Summary的类型
pub fn notify(item: &impl Summary) {println!("Breaking news! {}", item.summarize());
}
  •  Trait Bound: impl Trait 适用于短小的例子。trait bound 则适用于更复杂的场景,trait bound 与泛型参数声明在一起,位于尖括号中的冒号后面。

//使用相同类型的trait可以转换成下边的更简单写法
pub fn notify(item1: &impl Summary, item2: &impl Summary) {}// trait Bound的写法
pub fn notify<T: Summary>(item1: &T, item2: &T) {}
  • 通过 + 指定多个 trait bound:

pub fn notify<T: Summary + Display>(item: &T) {}
  •  通过 where 简化 trait bound:每个泛型有其自己的 trait bound,所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息,这使得函数签名难以阅读

fn some_function<T, U>(t: &T, u: &U) -> i32where T: Display + Clone,U: Clone + Debug
{
}
声明周期:
  •  Rust 中的每一个引用都有其 生命周期(lifetime),也就是引用保持有效的作用域,Rust 编译器有一个借用检查器(borrow checker)它比较作用域来确保所有的借用都是有效的

  •  函数签名中的生命周期注解:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() {x} else {y}
}
fn main() {let string1 = String::from("abcd");let string2 = "xyz";let result = longest(string1.as_str(), string2);println!("The longest string is {}", result);
}
  • 参数声明周期使用方法,或者靠编译器提示添加。

&i32        // 引用, 没有生命周期参数的 i32 的引用
&'a i32     // 带有显式生命周期的引用 ,一个有叫做 'a 的生命周期参数的 i32 的引用
&'a mut i32 // 带有显式生命周期的可变引用 一个生命周期也是 'a 的 i32 的可变引用
  • 结构体定义中的生命周期注解:

struct ImportantExcerpt<'a> {part: &'a str,
}
fn main() {let novel = String::from("Call me Ishmael. Some years ago...");let first_sentence = novel.split('.').next().expect("Could not find a '.'");let i = ImportantExcerpt {part: first_sentence,};
}
  • 静态生命周期:

  •  生命周期能够存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期

let s: &'static str = "I have a static lifetime.";

九,集合:

vector:
  •  类型是 Vec

     在内存中彼此相邻地排列所有的值, vector 只能储存相同类型的值
  // Vec::new 创建let v: Vec<i32> = Vec::new();v.push(2);v.push(4);let x = v.pop();
  • 初始值来创建一个 Vec :

 let v = vec![1, 2, 3];
  •  读取 vector 的元素: 使用 &[index] 返回一个引用, 或者使用 get 方法以索引作为参数来返回一个 Option<&T>。

fn main() {let v = vec![1, 2, 3, 4, 5];let third: &i32 = &v[2];println!("The third element is {}", third);match v.get(2) {Some(third) => println!("The third element is {}", third),None => println!("There is no third element."),}
}
  •  使用枚举来储存多种类型: 创建一个储存枚举值的 vector,这样最终就能够通过vector存储实际是不同类型的值了

fn main() {enum SpreadsheetCell {Int(i32),Float(f64),Text(String),}let row = vec![SpreadsheetCell::Int(3),SpreadsheetCell::Text(String::from("blue")),SpreadsheetCell::Float(10.12),];
}
HashMap
    let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10); //插入//只在键没有对应值时插入scores.entry(String::from("Yellow")).or_insert(50);scores.entry(String::from("Blue")).or_insert(50);println!("{:?}", scores);

第二波先介绍到这里,后边会把第三波的整理出来,这些精简的笔记也可以做为日常学习rust回顾、知识点速查等。

PS: 也欢迎大家评论和交流~ 更多文章也可关注微信公号:良技漫谈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1166.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CST软件如何理解Axial Ratio轴比

这个问题很多用户问&#xff0c;所以解答一下。 之前写过两个偏振片的案例&#xff0c;一个从S参数看轴比&#xff0c;另一个从远场结果中优化轴比。 下面我们分析一下电磁波的轴比。首先&#xff0c;轴比AR最普通的定义就是椭圆极化长短轴的比&#xff1a; 定义1&#xff1…

高等数学 6.2 定积分在几何学上的应用

文章目录 一、平面图形的面积1.直角坐标情形2.极坐标情形 二、体积1.旋转体体积2.平行截面面积为已知的立体的体积 三、平面曲线的弧长 一、平面图形的面积 1.直角坐标情形 我们已经知道&#xff0c;由曲线 y f ( x ) ( f ( x ) ⩾ 0 ) y f(x) (f(x) \geqslant 0) yf(x)(f…

Nginx 实现动态封禁IP,详细教程来了

Nginx 实现动态封禁IP&#xff0c;详细教程来了 需求环境准备设计方案在操作系统层面&#xff0c;配置 iptables&#xff0c;来拦截指定 IP 的网络请求在 Web 服务器层面&#xff0c;通过 Nginx 自身的 deny 选项或者 lua 插件配置 IP 黑名单在应用层面&#xff0c;在处理请求之…

SAP(PP生产制造)拆解工单业务处理

1、BOM维护 要拆解的成品或半成品要和原成品、半成品BOM一致 2、创建拆解工单 CO01选择拆解工单的类型&#xff0c;以及填写拆解的物料和拆解工厂 维护工单组件 注意&#xff1a; 1、拆解入库组件的数量需要维护为负数 2、拆解工单投料组件数量维护为正数 3、拆解工单收发…

【已解决】cra 配置路径别名 @ 后,出现 ts 报错:找不到模块“@/App”或其相应的类型声明。ts(2307)

cra 配置路径别名 后&#xff0c;出现 ts 报错&#xff1a;找不到模块“/App”或其相应的类型声明。ts(2307) 然后可以在 tsconfig.json 中配置 baseUrl 和 paths &#xff1a; {"compilerOptions": {"target": "es5","lib": [&quo…

定制化视频生成新模范!零样本主体驱动,精确运动控制!复旦阿里等发布DreamVideo-2

文章链接&#xff1a;https://arxiv.org/pdf/2410.13830 项目链接&#xff1a;https://dreamvideo2.github.io/ 亮点直击 DreamVideo-2&#xff0c;首个无需微调&#xff0c;同时支持主体定制和运动控制的零样本视频定制框架&#xff0c;能够通过设计的参考注意力学习主体外观&…

mockito+junit完成单元测试

一&#xff1a;单元测试的特点 配合断言使用&#xff08;可以杜绝System.out&#xff09;可以重复执行不依赖环境不会对数据产生影响spring的上下文环境不是必须的一般都需要配合mock类框架来实现 二&#xff1a;常用的mock类框架 mockito 官网&#xff1a;Mockito framew…

【LeetCode:153. 寻找旋转排序数组中的最小值 + 二分】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

【Python系列】poetry安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

linux之网络子系统- TCP连接的开销,主要是内存的开销

一、相关实际问题 内核是如何管理内存的如何查看内核使用的内存信息服务器上一条ESTABLISH状态的空连接需要消耗多少内存机器上出现了3万多个TIME_WAIT&#xff0c;内存开销会不会很大 二、Linux内核如何管理内存 内核针对自己的应用场景&#xff0c;使用了一种叫做SLAB/SLU…

第三十四篇:URL和URI的区别,HTTP系列一

前面我们讲到通过TCP协议通信双方建立可靠连接&#xff0c;那么此时双方进行通信&#xff0c;需要用人能理解的形式进行信息组织&#xff0c;也就是为各种特定需求服务&#xff0c;满足日常生活中的各种场景。 比如&#xff1a;网页浏览、电子邮件、远程登录、文件传输、网络管…

4499元起!苹果发布新款Mac mini:升级M4/M4 Pro 仅手掌大小

10月30日消息&#xff0c;今晚不仅是小米发布了重磅旗舰&#xff0c;苹果也带来了重磅升级后的新款Mac mini。 目前已经上架官网&#xff0c;采用全新外观设计&#xff0c;仅仅只有手掌大小&#xff0c;可以直接托在手心&#xff0c;不过厚度相对增加了一些&#xff0c;具体尺寸…

Golang | Leetcode Golang题解之第522题最长特殊序列II

题目&#xff1a; 题解&#xff1a; func isSubseq(s, t string) bool {ptS : 0for ptT : range t {if s[ptS] t[ptT] {if ptS; ptS len(s) {return true}}}return false }func findLUSlength(strs []string) int {ans : -1 next:for i, s : range strs {for j, t : range s…

b站小土堆PyTorch视频学习笔记(CIFAR10数据集分类实例)

1、准备数据集并查看数据集长度 train_data torchvision.datasets.CIFAR10(root"./data", trainTrue, transformtorchvision.transforms.ToTensor(), downloadTrue) test_data torchvision.datasets.CIFAR10(root"./data", trainFalse, transformtorch…

ESP8266 连接 MQTT 服务器EMQX 连接MQTTX

目录 1.先用有一台自己的云服务器 2. 使用FinalShell连接阿里云云服务器ECS 3.安装宝塔 4.在云服务器打开8888端口 5.使用外网面板地址打开宝塔面板 6.安装Docker 7.下载emqx 8.打开emqxWeb 界面 9.下载MQTTX 10.EMQX加一个客户端 11.开始通信 12.加入单片机ESP8266 …

开源代码管理平台Gitlab如何本地化部署并实现公网环境远程访问私有仓库

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 本文主要介绍如何在Linux CentOS8 中搭建GitLab私有仓库并且结合内网穿透工具实现在公网…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录功能设计

24.11.03 1.修改项目目录 从今天开始将正式进行功能的设计&#xff0c;首先需要对原来的项目结构进行修改&#xff0c;主要是添加新的文件夹用于存放新的文件。下面进行展示和讲解&#xff1a; 我用红圈圈出了新添加的文件夹&#xff0c;介绍下它们都是干啥的&#xff1a; da…

论文 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES

1. 背景信息 在信息检索领域&#xff0c;传统的方法往往依赖于大量的标注数据来训练模型&#xff0c;以便在各种任务中表现良好。然而&#xff0c;许多实际应用中的监督数据是有限的&#xff0c;尤其是在不同的检索任务中。最近的研究开始关注如何从一个拥有丰富监督数据的任务…

IDEA 取消参数名称提示、IDEA如何去掉变量类型提醒

解决办法 1.File—>Setting–>Editor—>Inlay Hints—>Parameter names—> Java—>Parameters with names that are cont 取消勾选&#xff0c;点击Apply 2.File—>Setting–>Editor—>Inlay Hints—>Parameter names—> Java—>‘New’…

three.js 智慧城市扫光效果

城市扫光效果在线预览 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoader } from three/examples/jsm/loaders/GLTFLoader.js import { DRACOLoader } from three/examples/jsm/loaders/DRACOLoa…