安装:
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’

整型溢出

元组

元组中元素可以有不同的类型

image.png

数组

image.png

切片

image.png
**..** rust range 语法

结构体

注意 rust 的结构体和 类有本质上的不同。结构体是数据的集合,不存在方法。

  1. 元组结构
  2. C结构
  3. 元组结构

    枚举与match匹配

    类型转换

    as
    transmute
    只能在 unsafe 块中使用。

    流程控制

    rust 表达式

    rust 是基于表达式的语言。image.png
    if 和 loop 是可以有返回值的。

    if else

    image.png

for

image.png

while

image.png

for-range

image.png
优先使用 ForRange

match

模式匹配语法。

if let 语法糖

经常会使用到

  1. 替换 match

image.png

  1. 可以匹配 枚举中的参数

image.png

while let 语法糖

不经常使用

image.png

函数与方法

image.png

函数与闭包

基本形式:
|参数| -> { 代码 }
image.png
move 语句将 环境中的变量移动到 闭包中。比如多线程的场景
image.png

高阶函数

  • 可以接受一个或多个函数作为输入
  • 输出一个函数

    发散函数

    基本上不会用到
    image.png

Rust中的模块化编程

Packege 包 一个或多个 carte
Crate 箱 最小编译单元,库或二进制
Module 模块 mod 关键字,组织代码,是文件/目录级别的划分

pub 关键字 :pub,pub(crate)
self 关键字: 当前模块,super关键字: 父级模块

如果组织一个 rust 的项目

文件/文件夹作为mod


image.png

泛型

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

函数泛型
image.png
结构体泛型
image.png

结构体泛型方法

image.png

traits定义共同的行为

类似于go的接口
实现 traits 的例子:
image.png

1)
image.png
1) 的语法糖版本
image.png

自动派生

  • 编译器完成,没有运行时开销
  • 一般是给结构体自动派生 traits,结构体中的成员已经实现了相应的 traits

image.png
Debug 是 Trait
常用的自动派生 Trait

  • Debug {:?} 格式输出
  • PartialEq 判断相等
  • Default 会自动生成一个 default() 方法,为结构体赋初始值,可以理解为默认构造

作用域及作用域控制

所有权是 Rust 最独特的特性, 它使 Rust 能够在不需要 GC 的情况下保证内存安全. 在本章中, 我们将讨论所有权以及几个相关特性: 借用/切片, 以及 Rust 如何在内存中布局数据.

所有权问题

c/c++的内存管理模型 是手动管理, 基于 堆栈 malloc free。 go/java 的内存管理模型 是垃圾回收机制。

rust 的内存管理模型 采用了一种中间方案 (RAII),兼具了GC 对应使用者的友好,同时又有很好的性能。

image.png

作用域就是大括号
示例1:
image.png
所有权由 s1 转移到 s2 所以上面的代码编译报错。

示例2:
image.png
s1 的所有权转移个 s2 , 打印 s2 输出 hello world。

Rust 中的借用

一个值只有一个所有者。借用的化就是希望使用这个值,而不拥有这个值。
使用 & 符号
示例:
image.png
可变引用和不可变引用
image.png

声明周期

一个变量的生命周期从创建的时候开始, 到销毁该变量的时候生命周期结束.
编译器通过生命周期确保所有的借用都是有效的: 即确保借用存在时, 原值不会被销毁.
在绝大多数情况下, 生命周期和变量的作用域是一致的.

  1. fn main() {
  2. let i = 3; // i 的生命周期开始
  3. {
  4. let borrow1 = &i; // borrow1 的生命周期开始
  5. println!("borrow1: {}", borrow1);
  6. } // borrow1 的生命周期结束
  7. {
  8. let borrow2 = &i; // borrow2 的生命周期开始
  9. println!("borrow2: {}", borrow2);
  10. } // borrow2 的生命周期结束
  11. } // i 的生命周期结束

在上述的代码中, 可以看到对一个值的引用的生命周期总是处于原值的生命周期之内.

生命周期的注释

image.png
以下代码编译会报错,

  1. fn str_bigger(s1: &str, s2: &str) -> &str {
  2. if s1 > s2 {
  3. s1
  4. } else {
  5. s2
  6. }
  7. }

image.png
编译器提示给出了生命周期注解的写法。 定义声明周期<'a>,绑定生命周期'a
意思就是由于无法判断返回的声明周期,这通过注解,将这个几个参数的声明周期同步。

Rust 的错误处理机制

异常定义为不可恢复的错误

不可恢复的错误

调用这些宏,程序会崩溃退出
image.png

可恢复的错误

Result 枚举
示例:
image.png

自定义错误和问号表达式

问号表达式可以传递错误。error 类型要一样。
示例:
image.png
包装 error, 为了实现向上传递
image.png
rust 的 main 可以有返回值:
image.png

Rust 的标准库

  • Box
  • Rc
  • Vec
  • HashMap
  • String
  • SystemTime

    智能指针 Box

    image.png

image.png
dyn关键字用于强调相关trait的方法是动态分配的。要以这种方式使用trait,它必须是“对象安全”的。
注意: std::error::Error 是 trait

引用计数 Rc

vector 动态数组

HashMap

多种字符串

系统时间SystemTime

书籍

Rust语言圣经(Rust Course) https://course.rs/about-book.html

仓库

发布仓库 https://crates.io/

文档

https://docs.rs/
https://doc.rust-lang.org/std/index.html