安装:curl --proto '=https' --tlsv1.2 -sSf [https://sh.rustup.rs](https://sh.rustup.rs) | sh
基本数据类型
可变变量和不可变变量
不可变变量 let x = 1,可变变量 let mut x = 1。 常量 const x = 1。
基础数据类型
整数
i8 u8 i16 u16 isize, usize 默认是 i32,
浮点
f32,f64
布尔
bool
字符
单引号, let x = ‘ hello world’
整型溢出
元组
数组
切片

**..** rust range 语法
结构体
注意 rust 的结构体和 类有本质上的不同。结构体是数据的集合,不存在方法。
- 元组结构
- C结构
- 元组结构
枚举与match匹配
类型转换
as
transmute
只能在 unsafe 块中使用。流程控制
rust 表达式
rust 是基于表达式的语言。
if 和 loop 是可以有返回值的。if else

for
while

for-range
match
if let 语法糖
经常会使用到
- 替换 match

- 可以匹配 枚举中的参数

while let 语法糖
函数与方法

函数与闭包
基本形式:|参数| -> { 代码 }
move 语句将 环境中的变量移动到 闭包中。比如多线程的场景
高阶函数
Rust中的模块化编程
| Packege 包 | 一个或多个 carte |
|---|---|
| Crate 箱 | 最小编译单元,库或二进制 |
| Module 模块 | mod 关键字,组织代码,是文件/目录级别的划分 |
pub 关键字 :pub,pub(crate)
self 关键字: 当前模块,super关键字: 父级模块
如果组织一个 rust 的项目
文件/文件夹作为mod

泛型
- 使用泛型作为函数类型参数
- 泛型作为结构体成员类型
- Traits: 定义共享的行为
- 特征绑定
函数泛型
结构体泛型
结构体泛型方法

traits定义共同的行为
类似于go的接口
实现 traits 的例子:
1)
1) 的语法糖版本
自动派生
- 编译器完成,没有运行时开销
- 一般是给结构体自动派生 traits,结构体中的成员已经实现了相应的 traits

Debug 是 Trait
常用的自动派生 Trait
- Debug {:?} 格式输出
- PartialEq 判断相等
- Default 会自动生成一个 default() 方法,为结构体赋初始值,可以理解为默认构造
作用域及作用域控制
所有权是 Rust 最独特的特性, 它使 Rust 能够在不需要 GC 的情况下保证内存安全. 在本章中, 我们将讨论所有权以及几个相关特性: 借用/切片, 以及 Rust 如何在内存中布局数据.
所有权问题
c/c++的内存管理模型 是手动管理, 基于 堆栈 malloc free。 go/java 的内存管理模型 是垃圾回收机制。
rust 的内存管理模型 采用了一种中间方案 (RAII),兼具了GC 对应使用者的友好,同时又有很好的性能。

作用域就是大括号
示例1:
所有权由 s1 转移到 s2 所以上面的代码编译报错。
示例2:
s1 的所有权转移个 s2 , 打印 s2 输出 hello world。
Rust 中的借用
一个值只有一个所有者。借用的化就是希望使用这个值,而不拥有这个值。
使用 & 符号
示例:
可变引用和不可变引用
声明周期
一个变量的生命周期从创建的时候开始, 到销毁该变量的时候生命周期结束.
编译器通过生命周期确保所有的借用都是有效的: 即确保借用存在时, 原值不会被销毁.
在绝大多数情况下, 生命周期和变量的作用域是一致的.
fn main() {let i = 3; // i 的生命周期开始{let borrow1 = &i; // borrow1 的生命周期开始println!("borrow1: {}", borrow1);} // borrow1 的生命周期结束{let borrow2 = &i; // borrow2 的生命周期开始println!("borrow2: {}", borrow2);} // borrow2 的生命周期结束} // i 的生命周期结束
在上述的代码中, 可以看到对一个值的引用的生命周期总是处于原值的生命周期之内.
生命周期的注释

以下代码编译会报错,
fn str_bigger(s1: &str, s2: &str) -> &str {if s1 > s2 {s1} else {s2}}

编译器提示给出了生命周期注解的写法。 定义声明周期<'a>,绑定生命周期'a
意思就是由于无法判断返回的声明周期,这通过注解,将这个几个参数的声明周期同步。
Rust 的错误处理机制
不可恢复的错误
调用这些宏,程序会崩溃退出
可恢复的错误
自定义错误和问号表达式
问号表达式可以传递错误。error 类型要一样。
示例:
包装 error, 为了实现向上传递
rust 的 main 可以有返回值:
Rust 的标准库

dyn关键字用于强调相关trait的方法是动态分配的。要以这种方式使用trait,它必须是“对象安全”的。
注意: std::error::Error 是 trait
引用计数 Rc
vector 动态数组
HashMap
多种字符串
系统时间SystemTime
书籍
Rust语言圣经(Rust Course) https://course.rs/about-book.html
仓库
发布仓库 https://crates.io/






