> For the complete documentation index, see [llms.txt](https://lester123.gitbook.io/rust-simple/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lester123.gitbook.io/rust-simple/master.md).

# Rust语言精简手册

你好，欢迎来到`Rust`世界！

如果你以前从未接触过`Rust`，或者你想尝试写个`Rust`版的`Hello World!`。

你可以尝试在`Rust`[练习场](https://play.rust-lang.org)输入以下内容，并运行它：

```rust
fn main() {
    println!("Hello World!");
}
```

恭喜你，你已经成功地迈出学习`Rust`语言的第一步。

接下来会通过这个`Rust`语言的精简版，带你感受一下`Rust`世界的精彩。

## 数据结构

通过关键字定义的数据类型和内存位置。

| 示例                         | 解释                                                                                                                |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `struct S {}`              | 定义**结构体**`S`，[示例](https://rustwiki.org/zh-CN/rust-by-example/custom_types/structs.html)                           |
| `struct S { x: T }`        | 定义**结构体**`S`，包含一个类型为`T`的成员`x`                                                                                     |
| `struct S ​(T);`           | 定义**元组结构体**`S`，有一个类型为`T`的`.0`编号的成员                                                                                |
| `struct S;`                | 定义零大小的**单元结构体**`S`                                                                                                |
| `enum E {}`                | 定义**枚举**`E`，[示例](https://rustwiki.org/zh-CN/rust-by-example/custom_types/enum.html)                               |
| `enum E { A, B​(), C {} }` | 定义**枚举**`E`的成员，可以是**单元**`A`，**元组**`B`，**结构体**`C`                                                                  |
| `enum E { A = 1 }`         | 如果成员仅是**单元**，可以拥有显式辨别值                                                                                            |
| `union U {}`               | 用于FFI兼容的不安全类`C`的联合体，参见`Rust`[规范](https://doc.rust-lang.org/stable/reference/items/unions.html)                    |
| `static X: T = T();`       | 具有`'static`生命周期的全局**静态变量**，有个固定的内存地址，[示例](https://rustwiki.org/zh-CN/rust-by-example/custom_types/constants.html) |
| `const X: T = T();`        | 定义**常量**`X`，生命周期是全局的，但没有固定的内存地址                                                                                   |
| `let x: T;`                | 在栈上绑定**变量**`x`，一次分配，不可变                                                                                           |
| `let mut x: T;`            | 类似`let`，但允许可变借用                                                                                                   |
| `x = y;`                   | `y`将内存地址转移给`x`，如果类型`T`是`Copy`的，则复制`y`；否则`y`后续不可用                                                                  |

创建和访问数据结构。

| 示例              | 解释                                                                                                       |
| --------------- | -------------------------------------------------------------------------------------------------------- |
| `S { x: y }`    | 实例化结构体`S{}`，或枚举`E::S{}`，将成员`x`设置为`y`                                                                     |
| `S { x }`       | 类似上面，但使用了局部变量`x`                                                                                         |
| `S { ..s }`     | 使用`s`设置结构体`S`剩余的成员，对默认值尤其有用，[示例](https://doc.rust-lang.org/std/default/trait.Default.html)               |
| `S { 0: x }`    | 类似下面的`S(x)`，设置索引`.0`成员为`x`                                                                               |
| `S​ (x)`        | 设置索引`.0`成员为`x`                                                                                           |
| `S`             | 单元结构体`S`，实例就是其本身                                                                                         |
| `E::C { x: y }` | 实例化枚举成员`C`                                                                                               |
| `()`            | 单元类型，唯一的值就是其本身                                                                                           |
| `(x)`           | 括号表达式                                                                                                    |
| `(x,)`          | 单元素元组表达式，[示例](https://rustwiki.org/zh-CN/rust-by-example/primitives/tuples.html)                         |
| `(S,)`          | 单元素元组类型                                                                                                  |
| `[S]`           | 不确定大小的数组，切片，[示例](https://rustwiki.org/zh-CN/rust-by-example/primitives/array.html)                       |
| `[S; n]`        | **数组类型**，`S`表示数组中元素的类型，`n`表示数组的大小，[示例](https://rustwiki.org/zh-CN/rust-by-example/primitives/array.html) |
| `[x; n]`        | 创建一个包含`n`份值`x`的拷贝                                                                                        |
| `[x, y]`        | 定义**结构体**`S`，[示例](https://rustwiki.org/zh-CN/rust-by-example/custom_types/structs.html)                  |
| `x[0]`          | 用于不可变内容的索引操作                                                                                             |
| `x[..]`         | 用作切片的索引操作，[示例](https://doc.rust-lang.org/std/ops/struct.Range.html)                                      |
| `x[a..]`        | 生成在索引`a`之后所有元素的切片                                                                                        |
| `x[..b]`        | 生成在索引`b`之前所有元素的切片                                                                                        |
| `x[a..b]`       | 生成在索引`a`和`b`之间所有元素的切片                                                                                    |
| `a..b`          | 创建左闭右开区间的**范围类型**                                                                                        |
| `a..=b`         | 创建全闭区间的**范围类型**                                                                                          |
| `s.x`           | 通过字段名访问                                                                                                  |
| `s.0`           | 通过索引访问，用于元组类型`S(T)`                                                                                      |

## 类型别名和强制转换

| 示例                | 解释                                                                           |
| ----------------- | ---------------------------------------------------------------------------- |
| `type T = S;`     | 创建类型`T`的另一个名字`S`                                                             |
| `Self`            | 用于表示`trait`和实现中的实现类型                                                         |
| `self`            | 用于表示方法对象本身                                                                   |
| `&self`           | 同上，表示借用                                                                      |
| `&mut self`       | 同上，表示可变借用                                                                    |
| `self: Box<Self>` | 智能指针                                                                         |
| `S as T`          | 消除歧义，限定类型`S`使用`trait``T`                                                     |
| `S as R`          | `use`语法中，导入`S`为`R`                                                           |
| `x as u32`        | 原生类型的强制类型转换，[示例](https://rustwiki.org/zh-CN/rust-by-example/types/cast.html) |

## 流程控制

| 示例                 | 解释                                                                                                 |
| ------------------ | -------------------------------------------------------------------------------------------------- |
| `while x {}`       | `while`循环，当`x`为`true`时循环，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/while.html)  |
| `loop {}`          | 无限循环，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/loop.html)                       |
| `for x in iter {}` | `for`表达式用于循环遍历迭代器`iter`，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/for.html)     |
| `if x {} else {}`  | 条件表达式，所有分支必须返回相同的类型，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/if_else.html)     |
| `'label: loop {}`  | 标签循环，对嵌套循环中的流程控制很有用，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/loop/nested.html) |
| `break`            | 使用`break`退出一个循环                                                                                    |
| `break x`          | 使`loop`表达式返回值`x`，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/loop/return.html)    |
| `break 'label`     | 中断`'label`标签的循环                                                                                    |
| `continue`         | 中断循环体的当前迭代，返回到下一轮循环                                                                                |
| `continue 'label`  | 中断指定`'label`标签的循环体的当前迭代，返回到下一轮循环                                                                   |

## 函数，闭包与`trait`

定义代码块及其抽象。

| 示例                 | 解释                                                                                                            |
| ------------------ | ------------------------------------------------------------------------------------------------------------- |
| `trait T {}`       | 定义`trait`，[示例](https://rustwiki.org/zh-CN/rust-by-example/trait.html)                                         |
| `trait T : R {}`   | `T`是`R`的子`trait`，任何类型实现`T`之前必须实现`R`                                                                           |
| `impl S {}`        | 实现类型`S`                                                                                                       |
| `impl T for S {}`  | 为类型`S`实现`trait``T`                                                                                            |
| `impl !T for S {}` | 为类型`S`禁用自动派生`auto traits`                                                                                     |
| `fn f() {}`        | 定义**函数**，[示例](https://rustwiki.org/zh-CN/rust-by-example/fn.html) ，或定义关联函数（在`impl`内部）                         |
| `fn f() -> S {}`   | 同上，函数返回值为类型`S`                                                                                                |
| `fn f(&self) {}`   | 定义**方法**，作为`impl`的一部分                                                                                         |
| `fn() -> S`        | 函数指针，[示例](https://kaisery.github.io/trpl-zh-cn/ch19-05-advanced-functions-and-closures.html)，不要和`trait``Fn`混淆 |
| `\|\| {}`          | 闭包，[示例](https://rustwiki.org/zh-CN/rust-by-example/fn/closures.html)                                          |
| `\|x\| {}`         | 绑定参数`x`的闭包                                                                                                    |
| `\|x\| x + x`      | 没有块表达式的闭包                                                                                                     |
| `move \|x\| x + y` | 强制闭包取得被捕获变量的所有权，[示例](https://rustwiki.org/zh-CN/rust-by-example/fn/closures/capture.html)                     |
| `\|\| true`        | 没有参数的闭包                                                                                                       |

## 生命周期

| 示例                   | 解释                                                                          |
| -------------------- | --------------------------------------------------------------------------- |
| `'a`                 | 生命周期参数，[示例](https://rustwiki.org/zh-CN/rust-by-example/scope/lifetime.html) |
| `&'a S`              | 一个拥有生命周期`'a`的引用                                                             |
| `&'a mut S`          | 同上，但引用的内容可变                                                                 |
| `S<'a>`              | 一个拥有生命周期`'a`的类型                                                             |
| `fn f<'a>(t: &'a T)` | 一个函数，其拥有生命周期`'a`的输入引用，其中`'a`的存活时间至少与函数的一样长                                  |
| `'static`            | 在整个程序运行的时期中存在                                                               |

## 泛型与`trait`约束

泛型会与许多其他结构相结合，例如：`struct S<T>, fn f<T>(), ...`

| 示例                     | 解释                                                                                                                   |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `S<T>`                 | 具有类型参数`T`的泛型`S`，[示例](https://rustwiki.org/zh-CN/rust-by-example/generics.html)                                       |
| `S<T: R>`              | 类型`S`的类型参数`T`必须实现`trait``R`，[示例](https://rustwiki.org/zh-CN/rust-by-example/generics/bounds.html)                    |
| `T: R, P: S`           | 分别对类型`T``P`定义约束，类型间用逗号分隔                                                                                             |
| `T: R + S`             | 多重约束，`T: R, S`是错误的                                                                                                   |
| `T: ?Sized`            | T`b`                                                                                                                 |
| `T: 'a`                | `T`生命周期约束，需要长于`a`），[示例](https://rustwiki.org/zh-CN/rust-by-example/scope/lifetime/lifetime_bounds.html)              |
| `T: R + 'a`            | `T`必须实现`trait``R`，并且`T`生命周期需要长于`a`                                                                                   |
| `'b: 'a`               | `b`生命周期需要长于`a`                                                                                                       |
| `S<T> where T: R`      | 类似`S<T: R>`，较长的约束时更可读                                                                                                |
| `S<T = R>`             | 默认类型参数，关联类型                                                                                                          |
| `S<'_>`                | 匿名生命周期推断，[示例](https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/the-anonymous-lifetime.html) |
| `S<_>`                 | 匿名类型推断                                                                                                               |
| `S::<T>`               | turbofish，为泛型中的方法指定具体参数                                                                                              |
| `trait T<X> {}`        | `trait`泛型，类型参数`X`，可以多次实现`T`                                                                                          |
| `trait T { type X; }`  | `trait`关联类型，无需标注类型，[示例](https://kaisery.github.io/trpl-zh-cn/ch19-03-advanced-traits.html)                           |
| `type X = R;`          | 设置关联类型，impl T for S { type X = R; }                                                                                  |
| `impl<T> S<T> {}`      | 为泛型`T`实现功能                                                                                                           |
| `impl S<T> {}`         | 实现`S<T>`功能                                                                                                           |
| `fn f() -> impl T`     | "impl Trait"语法，返回`trait``T`，[示例](https://kaisery.github.io/trpl-zh-cn/ch10-02-traits.html)                           |
| `fn f(x: &impl T)`     | "impl Trait"语法约束，类似`fn f<S:T>(x: &S)`                                                                                |
| `fn f(x: &dyn T)`      | 同上，但是动态分发                                                                                                            |
| `fn f() where Self: R` | 在`trait`中，只有实现了`R`的类型可访问`f`                                                                                          |
| `for<'a>`              | 高阶`trait`限定                                                                                                          |

## 组织代码

将项目划分为更小的单元，并最小化依赖性。

| 示例                     | 解释                                                                                                                     |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `mod m {}`             | 定义模块`m`，在`{}`中定义内容，[示例](https://rustwiki.org/zh-CN/rust-by-example/mod.html)                                           |
| `mod m;`               | 定义模块`m`，在`m.rs`或`m/mod.rs`中定义内容                                                                                        |
| `a::b`                 | `a`中元素`b`的命名空间路径，[示例](https://doc.rust-lang.org/stable/reference/paths.html#path-qualifiers)                           |
| `::b`                  | 从`root crate`搜索`b`                                                                                                     |
| `crate::b`             | 从当前`crate`搜索`b`                                                                                                        |
| `self::b`              | 从当前模块搜索`b`                                                                                                             |
| `super::b`             | 从父模块搜索`b`）                                                                                                             |
| `use a::b;`            | `use`声明，导入`b`，[示例](https://rustwiki.org/zh-CN/rust-by-example/mod/use.html)                                            |
| `use a::{b, c};`       | 同上，多个                                                                                                                  |
| `use a::b as x;`       | 同上，将`b`命名为`x`                                                                                                          |
| `use a::b as _;`       | 同上，匿名引入`b`，[示例](https://doc.rust-lang.org/stable/reference/items/use-declarations.html?highlight=_#underscore-imports) |
| `use a::*;`            | 导入`a`中一切                                                                                                               |
| `pub use a::b;`        | 重新导出`a::b`                                                                                                             |
| `pub T`                | 将可见性修改为公开                                                                                                              |
| `pub(crate) T`         | 在当前`crate`可见                                                                                                           |
| `pub(self) T`          | 在当前模块可见                                                                                                                |
| `pub(super) T`         | 在当前模块和父模块可见                                                                                                            |
| `pub(in a::b) T`       | 对`a::b`模块路径可见                                                                                                          |
| `extern crate a;`      | 链接外部`crate``a`，[示例](https://rustwiki.org/zh-CN/rust-by-example/crates/link.html)                                       |
| `extern "C" {}`        | 用于FFI\*链接外部库，比如"C"，[示例](https://rustwiki.org/zh-CN/rust-by-example/std_misc/ffi.html)                                  |
| `extern "C" fn f() {}` | 定义函数暴露给FFI                                                                                                             |

**FFI**，Foreign Function Interface，外部语言函数接口

## 模式匹配与解构

在`match`或`let`表达式或函数参数中构造。

| 示例                          | 解释                                                                                                   |
| --------------------------- | ---------------------------------------------------------------------------------------------------- |
| `match m {}`                | 模式匹配，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/match.html)                        |
| `let S { x } = s;`          | `let`绑定模式匹配                                                                                          |
| `let (_, b, _) = abc;`      | 忽略部分                                                                                                 |
| `let (a, ..) = abc;`        | 忽略其余                                                                                                 |
| `if let Some(x) = get() {}` | 若`get()`匹配`Some(x)`，则执行代码块，[示例](https://rustwiki.org/zh-CN/rust-by-example/flow_control/if_let.html) |
| `fn f(S { x }: S)`          | 函数参数，类似`let`                                                                                         |

## 引用和指针

| 示例         | 解释                                                                                        |
| ---------- | ----------------------------------------------------------------------------------------- |
| `&S`       | 引用，[示例](https://kaisery.github.io/trpl-zh-cn/ch04-02-references-and-borrowing.html)       |
| `&[S]`     | 切片引用，包含地址和长度                                                                              |
| `&str`     | 字符串引用                                                                                     |
| `&dyn S`   | `trait`对象引用，包含地址和虚表，[示例](https://kaisery.github.io/trpl-zh-cn/ch17-02-trait-objects.html) |
| `&mut S`   | 可变引用                                                                                      |
| `*const S` | 裸指针，不可变的，[示例](https://kaisery.github.io/trpl-zh-cn/ch19-01-unsafe-rust.html)              |
| `*mut S`   | 同上，可变裸指针                                                                                  |
| `&s`       | 借用，不获取所有权                                                                                 |
| `&mut s`   | 可变借用                                                                                      |
| `ref s`    | 引用绑定，[示例](https://rustwiki.org/zh-CN/rust-by-example/scope/borrow/ref.html)               |
| `*r`       | 解引用，[示例](https://kaisery.github.io/trpl-zh-cn/ch15-02-deref.html)                         |
| `*r = s;`  | 如果`r`是可变引用，移动或复制`s`到目标内存                                                                  |

## 宏和属性

元编程，代码生成，语法扩展

| 示例                       | 解释                                                                       |
| ------------------------ | ------------------------------------------------------------------------ |
| `m!()`                   | 宏调用，[示例](https://kaisery.github.io/trpl-zh-cn/ch19-06-macros.html)       |
| `#[attr]`                | 属性用于模块或项，[示例](https://rustwiki.org/zh-CN/rust-by-example/attribute.html) |
| `#[attr = "value"]`      | 属性形式1                                                                    |
| `#[attr(key = "value")]` | 属性形式2                                                                    |
| `#[attr(value)]`         | 属性形式3                                                                    |
| `#![attr]`               | 属性作用于整个`crate`                                                           |

## 学习心得

* 学习这种事，关键靠自己。被别人“喂”太多，不一定是好事。
* 不要期望短期内一次性学会一门编程语言，尤其是Rust语言。

## 学习资源

* [Rust语言官网](https://www.rust-lang.org/)
* [Rust语言中文社区](https://rust.cc/)
* [通过例子学Rust](https://rustwiki.org/zh-CN/rust-by-example/)
* [Rust语言标准库](https://doc.rust-lang.org/std/index.html)

![知行之录公众号](https://raw.githubusercontent.com/lesterli/blockchain/master/images/qrcode_for_gh_671a189749ee_258.jpg)
