Rust精简笔记
- 适用对Rust感兴趣,想快速学习上手(多学几轮)、Rust知识点速查、回顾。
- 精简总结使用,深入扩展需继续对应官网,真知实践。
- 参考The Rust Programming Language & Rust in Action
一.变量:
变量声明使用let, 默认为不可变(即只读),声明可变变量 mut (可读写)
1
2
3let x = 5; //类型可以由编译器自动推断出来
let y: i32 = 6; //或者是在创建变量时,声明类型
let z = 7i32; //数字类型,可以在数字字面量中加入类型注解
二.基本数据类型:
数字类型:
- 分为有符号和无符号整数,浮点数类型、特定平台的整数
- 每一个有符号的变体可以储存包含从 -2n-1 到2n-1-1 在内的数字,这里 n 是变体使用的位数。如:i8 范围(-128-127)
- 无符号的范围为0到 2n-1,如: u8 范围(0-255)(00000000 - 11111111)
类型 | 长度 | 描述 |
---|---|---|
i8, i16, i32, i64, i128 | 8,16,32,64,64,128 (bit) | 有符号整数 |
u8, u16, u32, u64, u128 | 8,16,32,64,64,128 (bit) | 无符号整数 |
f32, f64 | 32,64(位) | f32 是单精度浮点数,f64 是双精度浮点数 |
isize, usize | 32或64 | 32 位架构上它们是 32 位的,64 位架构上它们是 64 位的 |
Rust中的整型字面值:
数字字面值 | 描述 |
---|---|
Decimal (十进制) | 1_100 (使用 _ 做为分隔符以方便读数) |
Hex (十六进制) | 0xff(0x开头) |
Octal (八进制) | 0o77 (0o开头) |
Binary (二进制) | 0b1111_0000(0b开头) |
Byte (单字节字符)(仅限于u8) | b’A’(b开头) |
布尔类型 bool:
1 | fn main() { |
复合类型:
元组(tuple)和数组(array)
Tuple: 将多个其他类型的值组合进一个复合类型,声明后长度固定,索引下标从0开始.
1 | let tup: (i32, f64, u8) = (500, 8.4, 2); //声明类型 |
- array: 数组里数据类型必现一致,长度固定
1 | let a = [1, 2, 3, 4, 5]; // 自推断 |
三. 流程控制
if & if let:
1 | let number = 3; |
loop:
1 | let mut count = 0; |
Nested loops & labels (循环标签): 如果存在嵌套循环在一个循环上指定一个 循环标签(loop label) 标识为’名字
1 | 'outer: loop { |
while & while let:
1 | while n < 101 { |
for 遍历集合:
1 | let a = [10, 20, 30, 40, 50]; |
match:
1 | let optional = Some(0); |
四.所有权&引用&借用
所有权规则:
1 | Rust 中的每一个值都有一个 所有者(owner) |
借用规则:(引用的行为)
1 | 同一作用域内,一个资源要么有一个可变引用,要么存在多个不可变引用 |
String引用:
1 | let s1 = String::from("hello world!"); |
- 函数里使用值,但不获取所有权, 使用&,获取变量引用 ,仅读权限
1 | fn main() { |
- 函数里参数可变引用, 使用&mut ,获取变量可变操作
1 | fn main() { |
操作符对应的权限:
1 | x 不可变的值(所有权) |
字符串 slice:
- slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一类引用,它没有所有权
1 | fn main() { |
五. struct
- 普通结构体: struct+一个名字,在大括号中每一部分可以是不同类型,定义每一部分数据的名字和类型,称之为结构体字段
1 | struct User { |
- 创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键-值对的形式提供字段
1 | let userinfo = User { |
元组结构体(tuple structs):
- 元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型
1 | struct Color(i32, i32, i32); |
类单元结构体(unit-like structs):
- 没有任何字段的结构体
1 | struct AlwaysEqual; |
impl为结构体添加方法:
1 | struct Rectangle { |
- &self 实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 self 的Self 类型的参数
impl里的关联函数:
1 | impl Rectangle { |
所有在 impl 块中定义的函数被称为 关联函数(associated functions),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例
多个 impl 块: 每个结构体都允许拥有多个 impl 块, 但一个方法只能属于一个impl块。
六.Enum
- 结构体给予将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你将一个值成为一个集合之一的方法。
1 | enum IpAddrKind { |
枚举可以包含不同的类型:
1 | enum Message { |
- 结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。这是一个定义于我们 Message 枚举上的叫做 call 的方法:
1 | fn main() { |
标准库中实用的枚举:Option
1 | enum Option<T> { |
1 | enum Result<T, E> { |
七.match控制流结构
前面流程控制简单说明了match使用,结合enum来看看match的更多使用场景总结
基础匹配语法:
1 | let number = 2; |
match 解构结构体:
1 | struct Point { |
解构枚举:
1 | enum Message { |
解构嵌套的结构体和枚举:
1 | enum Color { |
用 .. 忽略剩余值:
1 | //通过使用 .. 来忽略 Point 中除 x 以外的字段 |
Match guards:
- 匹配守卫(match guard)是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支
1 | fn main() { |
@绑定:
- 运算符@,允许我们在创建一个存放值的变量的同时,测试其值是否匹配模式。即@ 可以在一个模式中同时测试和保存变量值。
1 | fn main() { |