Rust笔记【1】
- 元组和解构语法
let tup : (i32, f64, u8) = (666, 2.0, 1);let tup = (666, 2.0, 1);
let (x, y, z) = tup;let x = tup.0;
let y = tup.1;
let z = tup.2;
- 数组类型
数组定义是方括号:[ ]
元组定义是小圆括号:( )
结构体定义是大括号:{ },结构体定义和赋值中,成员用逗号,分隔(c++中使用分号分隔)
let arr = [1, 2, 3];
let sss = ["mon", "tue", "fri"];let a: [i32; 5]; # 长度为5的整型数组
let b: [3; 5]; # 5个3let data = a[0];
- 传参、赋值默认都是移动操作。
- 引用不移动所有权,默认引用是不可修改的。例如:
let s = String::from("hello");func(&s);fn func(str: &string) -> ...
- 可变引用:
如果创建了变量的一个可变引用,就不能再创建对改变量的其他引用(包括可变、不可变引用)。
在一个作用域内不能有多个可变引用,在不同的作用域、不同时创建多个可变引用。
如果已经创建一个或多个不可变引用,则不能再创建可变引用。
let mut s = String::from("hello");func(&mut s);fn func(str: &mut String) ->...
- 引用的个数:
在一个作用域内:
1)有一个或多个不变引用,无可变引用。
2)只有一个可变引用。
注意:作用域结束不是以大括号结束,是以变量最后一次使用结束变量作用域(是没有显式标志)。
例如:
let mut s = String::from("hello");
let r1 = &s; // 没问题
let r2 = &s; // 没问题
println!("{} and {}", r1, r2);
// 此位置之后r1 和r2 不再使用let r3 = &mut s; // 没问题
println!("{}", r3);
- slice是一类引用,引用集合中一段连续的元素序列。
关键字: 引用,集合,连续片段
字符串slice:
let slice_name = target_set[start_index .. end_index]let s = String::from("hello world");
let h = &s[0..5];
let w = &s[6..11];# 以下几个等效
let h1 = &s[..5];
let w = &s[6..];
let s2 = &s[..];
字符串slice类型声明:&str
fn func(s: &String) -> &str { ...
字符串字面值是slice
s类型是&str
let s = "hello world";
- 结构体
如果存储引用,则必须指定生命周期。否则编译错误。
struct Rectangle {width: i32,height: i32,
}# 实例化,不需要new,key: value方式赋值。
let retc = Rectangle {width: 10,height: 20,
}
- 类单元结构体 unit-like struct
用于在某个类型上实现trait,不存储数据
# 不需要大括号定义成员
struct SomeTrait;# 实例化,不需要括号,没有成员需要赋值
let obj = SomeTrait;
- 结构体更新语法
用一个已有结构体实例为另一个结构体赋值,新结构体只改变部分成员的值
struct User {a: i32,b: i32,c: i32,
}let u1 = User {a: 1,b: 2,c: 3,
};# ..u1(u1为已有结构体实例)必须放到最后
# 除明确复制的字段(b),其他字段值使用u1实例的
# 结构体更新语法,移动了数据,对于不支持copy trait的类型,更新后,原实例对象不可用。
let u2 = u1 {b: 99,..u1,
}
- 元组结构体
为元组指定名称,单独的成员不指定名称。有整体名称,无成员变量名称。
介于元组(无整体名称,无成员变量名称)和结构体(有整体名称,有成员变量名称)之间 。
适用于区分不同元组类型(便于重用和区分),不需要(或者很容易)区分成员变量。
成员变量匿名的struct类型定义。
struct Color {i32, i32, i32};
struct Point {i32, i32, i32};let bgColor = {0, 0, 0};
let pointA = {1, 2, 3};
- 增加属性,派生Debug trait
在struct定义前增加:#[derive(Debug)]
println中使用{:?}
,不能使用{ }
#[derive(Debug)]
struct Rect {width: i32,height: i32,
}fn main() {let rect = Rect { width: 20, height: 30 };println!("retc: {:?}\n", rect);
}
- 常用可派生(系统内置)trait
Debug
Copy
Clone
Default
Hash
PartialEq, Eq
PartialOrd, Ord
-
Rust中struct定义和C++类定义差别:
1)结构体(类)的数据成员定义和方法定义分离,c++在类中同时定义数据成员和方法。
2)c++中方法定义是一次性(或者说集中)定义所有方法,rust中可以多次通过impl定义。
3)c++中通过继承实现基类或者纯虚类,rust可实现trait(类似于接口interface)定义的接口方法(impl trait_name for struct_name {…} ) -
方法
定义方式和函数类似,差别:
1)定义在结构体(枚举、trait)上下文中:impl struct_name { }
2)第一个参数是self,代表调用方法的实例。
&self
是self: &Self
的缩写
3)方法使用self,可获取所有权、不变借用、可变借用。
4)impl块可以有多个,会自动合并
# 函数示例
struct Rect {width: i32,height: i32,
}fn area(rect: &Rect) -> i32 {rect.width * rect.height
}let r = Rect { width: 20, height: 30, };
let a = area(&r); # 调用函数
struct Rect {width: i32,height: i32,
}# 定义方法,
# 1. 在某个struct类型中:impl Rect { }
# 2. 第一个参数为:&self
# 3. 调用方式,通过实例调用:r.area()
impl Rect {fn area(&self) -> i32 {self.width * self.height}
}# 多个impl块
impl Rect {fn isSquare(&self) -> bool {self.width == self.height}
}let r = Rect { width: 20, height: 30, };
let x = r.area(); # 调用方法
let y = r.isSquare();
- 关联函数(像类的静态方法,和实例无关)
定义在impl块中,没有self参数,通常用于定义new函数,创建关联结构体的实例。
1)定义在imple中
2)没有self参数
3)返回Self类型(关联结构体类型)
4)使用结构体类型名调用,不用实例调用:Rect::new()
struct Rect {w: i32,h: i32,
}impl Rect {fn new (a: i32, b: i32) -> Self {Self {w: a,h: b,}} // fn new
} // impllet r = Rect::new(20, 30);
- 枚举类型
enum IpAddrKind {V4,V6,
}
// 可以替代enum + struct
// 枚举成员可以是各种类型值,不同成员可以是不同类型。
// 枚举类型成员名字,也是一个构建枚举类型实例的函数。
enum IpAddrKind {V4 (u8, u8, u8, u8),V6 (String),
}let four = IpAddrKind::V4;struct Ipv4Addr { //...
}
struct Ipv6Addr { //...
}
// enum成员是struct类型
enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}// 成员多种不同类型
enum Message {Quit,Move {x: i32, y:i32, },Write (String),ChangeColor(i32, i32, i32),
}// 在impl块中增加方法定义
impl Message {fn call(&self) {// ...}
}let m = Message::Write(String::from("hello"));
m.call();
- option
Rust中没有空值(NULL)。
Option是一个枚举类型。
包含在preclude中,不需要显示引入作用域。
使用Option就必须处理空值,其他不是Option类型的就一定不为空值。
enum Option<T> {None,Some(T),
}let num = Some(5);
let empty: Option<i32> = None;
- match运算符
enum Week {Mon,Tue,Sat,Sun,
}fn query(day: Week) -> i32 {match day {Week::Mon => 1,Week::Tue => {println!("...");2// }后面的,是可选的},Week::Sat => 6,Week::Sun => 7,}
}
- 绑定值模式
struct Ipv4Addr { //...
}
struct Ipv6Addr { //...
}
// enum成员是struct类型
enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}// 在match匹配过程中,把值绑定到变量
fn process(data: IpAddr) {match data {IpAddr::V4 (addr4) => {// consume addr4},IpAddr::V6 (addr6) => {// consume addr6},}
}
- 匹配 Option 和 if let
1)if let工作方式和match相同,是match的一个语法糖
2)if let后面是:模式 = 表达式
3)if let匹配match的一个分支,忽略其他值,也可以通过else分支处理。
fn func(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i+1),}
}let num = Some(12);
let res2 = func(num);
let res3 = func(None);// 和上面match等价
if let Some(i) = num {Some(i+1)
} else {None
}
- 通配模式和 “”占位符
Rust中match匹配必须是穷尽的。
1)为所有情况单独处理每个分支,例如enum类型。
2)使用通配模式,用到匹配的值。
3)使用占位符“”,和通配模式类似,匹配的值不用,抛弃。
4)通配符或占位符只能在最后一个分支,否则其后面的分支不会被执行。
let result: i32 = func();
match result {6 => "lucky",8 => "money",other => println!("the result: {}", other),
}match result {6 => "lucky",8 => "money",_ => "ok",// 或者完全忽略_ => (),
}
相关文章:

Rust笔记【1】
元组和解构语法 let tup : (i32, f64, u8) (666, 2.0, 1);let tup (666, 2.0, 1); let (x, y, z) tup;let x tup.0; let y tup.1; let z tup.2;数组类型 数组定义是方括号:[ ] 元组定义是小圆括号:( ) 结构体定义是大括号:{ }…...

代码随想录训练营day3:链表part1
理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…...

Bootstrap的咖啡网站实例代码阅读笔记
目录 01-index.html的完整代码02-图片可以通过类 rounded-circle 设置为圆形显示03-<li class"nav-item mt-1 a">中,类mt-1是什么意思?类a又是什么意思?04-href"javascript:void(0);"是什么意思?05-类f…...

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列代码后,运行结果是? seq[hello,good,morning] s*.join(seq) print(s)A: hello*good*m…...

FileWriter文件字符输出流
一.概念 以内存为基准,把内存中的数据以字符形式写出到文件中 二.构造器 public FileWriter(Filefile) 创建字节输出流管道与源文件对象接通 public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通 public Filewriter(File file,boolean append) …...

Vue的八个基础命令及作用
1.v-text 作用:获取data数据, 设置标签的内容,以纯文本进行显示v-text 会覆盖 标签中的内容,如果想要拼接数据,可以直接在v-text中拼接如果拼接的是数字:直接使用 “”如果拼接的是字符串,需要使用与外部不同的引号进…...

Log日志详解分析
目录 1、log日志的用途2、log日志级别3、什么时候需要输出日志1. 系统启动参数、环境变量2. 异常捕获处3. 函数获得期望之外的结果时4. 关键操作 4、日志输出的内容5、 注意事项1. 日志信息不明确2. 特殊异常处理3. 日志输出顺序4. 临时调试日志 6、xml文件配置7、linux下查看日…...

【API篇】九、Flink的水位线
文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是,一条数据在23:59:59产生,在00:00:01被处理,前者为事件时间,后者为处理时间。 从Flink1.12版本…...

#经典论文 异质山坡的物理模型 2 有效导水率
Binley, A., Beven, K., & Elgy, J. (1989). A physically based model of heterogeneous hillslopes: 2. Effective hydraulic conductivities. Water Resources Research, 25(6), 1227–1233. https://doi.org/10.1029/WR025i006p01227 这篇论文指出, 每个输…...

Java面试题-Redis-第一天(Redis简单介绍)
目录 一、Redis是什么?优缺点? 二、Redis为什么这么快? 三、Redis相较于Memcached有哪些优势? 四、为什么使用Redis做缓存? 五、为什么要用Redis而不用map/guava做缓存? 六、Redis的常用场景有哪些&am…...

Java 生成和读取JSON文件
下面的demo当中 ,是将json文件放到了zip包当中。如果不需要,可以拿掉。 1、生成对象JSON文件 public static void crateJson() {try {String orcPath "D:\\doc\\ts_service_orchestration.json";// 对象集合或者对象都可以List<DataPO>…...

k8s-----26、细粒度权限管理 RBAC
0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…...

【Unity ShaderGraph】| 制作一个 高级流体水球效果
前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 ,可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章…...

日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp120dll丢失”。那么,究竟什么是msvcp120dll文件?当它丢失时,我们会遇到哪些问题呢?本文将从以下几个方面进行详细阐述。 msvcp120dll是…...

自动驾驶之—2D到3D升维
前言: 最近在学习自动驾驶方向的东西,简单整理一些学习笔记,学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用:对于2DCNN,我们知道可以很好的处理单张图片中的信息,但是其对于视频这种由多帧图像组成的图…...

ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调
下载驱动 NVIDIA显卡驱动官方下载地址 下载好对应驱动并放在某个目录下, 在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。 禁用nouveau 首先,编辑黑名单配置。 vim /etc/modprobe.d/blacklist.conf 在文件的最后添加…...

爬虫-获取数据xpath
安装lxml pip3 install lxml基本用法 import reauests from lxml import etree url = xxx res = reuests.get(url).text html = etree.HTML(res) # 获取所有div标签 xpath = //div print(html.xpath(xpath)) #获取id=xx的div标签下的class=yy的span标签 xpath = //div[@id=&quo…...

SpringBoot中使用JdbcTemplate访问Oracle数据库
Oracle相信大家都不陌生吧,一个大型的数据库,至于数据库,我相信各位都比较熟悉了,一个软件系统,不论是我们常做的App、小程序、还是传统的web站点,我们都有用户的信息,相关业务的数据࿰…...

【Linux】权限完结
个人主页点击直达:小白不是程序媛 系列专栏:Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时,使用所属者身…...

计算机网络-应用层(3)
一、FTP 文件传输协议 (File Transfer Protocol,FTP) 简称为“文传协 议”,用于在Internet上控制文件的双向传输。 FTP 客户上传文 件时,通过服务器20号端口建立的连接是建立在TCP 之上的数 据连接,通过服务器21号端口建立的连接是建立在TCP 之上的控制连…...

虎去兔来(C++)
系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

docker基础镜像定制
docker基础镜像定制 1 简言2.准备软件源文件sources.list3.制作基础镜像3.1 编写Dockerfile命令3.2 制作基础镜像k8sbase1.03.3 测试基础镜像1 简言 官方基础镜像一般自带的linux命令是比较少,tcpdump、telnet登等命令是没有的,这时,定制一套适合自己的基础镜像是必要的,在…...

解决git action定时任务执行失败的方法
为了测试git action定时任务是否有效,你可能选择一个最近的时间测试, 但是发现怎么也触发不了,是不是觉得很苦恼。但是同样的时间,在第二天的定时任务又能成功运行。 这是什么原因? 原因就在上图,git act…...

Node编写重置用户密码接口
目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章,本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…...

Day13力扣打卡
打卡记录 奖励最顶尖的 k 名学生(哈希表排序) 用哈希表对所有的positive与negative词条进行映射,然后遍历求解。tip:常用的分割字符串的操作:1.stringstream配合getline() [格式buf, string, char]2.string.find()[find未找到目标会返回npos…...

独立开发者知识贴
有一个github仓库,叫做独立开发变现周刊,很不错,作者能从21年能坚持更新到现在,我很佩服。 它里边有很多独立开发者成功的作品案例,我对这些很感兴趣。 在阅读时,我会问自己以下几个问题: 解…...

软考系列(系统架构师)- 2009年系统架构师软考案例分析考点
试题一 软件架构设计 【问题1】(9分) 软件质量属性是影响软件架构设计的重要因素。请用200字以内的文字列举六种不同的软件质量属性名称并解释其含义。 常见的软件质量属性有多种,例如性能(Performance)、可用性(Ava…...

C语言每日一题(21)删除排序数组中的重复项
力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…...

如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决
在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题,我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…...

mongodb数据迁移的方法
这个方法只能将数据从一个mongo数据库转移到另一个mongo数据库 这个命令可以备份mongo数据(mongo数据库中的数据备份转换为文件) mongodump --host HOST --port PORT --username USERNAME --password PASSWORD --db DB -c COLLECTION --out OUT这个命令…...