Rust 速查表
最后更新
Hello World 与程序结构
Rust 程序从 fn main 开始执行;语句以分号结尾。
| 操作 | 语法 |
|---|---|
| 入口点 | fn main() { ... } |
| 输出一行 | println!("Hello, World!"); |
| 输出带值的内容 | println!("{} is {}", name, age); |
| 以调试格式输出 | println!("{:?}", value); |
| 单行注释 | // comment |
| 使用模块中的项 | use std::collections::HashMap; |
| 编译并运行 | cargo run |
| 编译发布版可执行文件 | cargo build --release |
变量与类型(let / mut)
绑定默认不可变;加上 mut 才能重新赋值。
| 操作 | 语法 |
|---|---|
| 不可变绑定 | let x = 5; |
| 可变绑定 | let mut count = 0; |
| 显式类型 | let age: u32 = 30; |
| 常量 | const MAX: u32 = 100; |
| 遮蔽(shadowing) | let x = x + 1; |
| 整数类型 | i32, u32, i64, usize |
| 其他标量类型 | f64, bool, char |
| 元组 | let pair: (i32, &str) = (1, "a"); |
| 类型转换 | let f = x as f64; |
流程控制
if 是表达式,Rust 有三种循环写法。
| 操作 | 语法 |
|---|---|
| if / else | if x > 0 { ... } else { ... } |
| 把 if 当作表达式 | let y = if x > 0 { 1 } else { -1 }; |
| 无限循环 | loop { ... } |
| 带返回值的循环 | let v = loop { break 5; }; |
| while 循环 | while x < 100 { ... } |
| for 遍历范围 | for i in 0..10 { ... } |
| for 遍历集合 | for item in &items { ... } |
| break / continue | break;, continue; |
函数
最后一个表达式(不带分号)就是返回值。
| 操作 | 语法 |
|---|---|
| 基本函数 | fn add(a: i32, b: i32) -> i32 { a + b } |
| 显式返回 | fn f() -> i32 { return 5; } |
| 无返回值 | fn log(msg: &str) { ... } |
| 接收引用 | fn len(s: &String) -> usize { s.len() } |
| 闭包 | let add = |a, b| a + b; |
| 带类型的闭包 | let sq = |x: i32| -> i32 { x * x }; |
| 函数作为参数 | fn apply(f: impl Fn(i32) -> i32) { ... } |
所有权与借用
每个值只有一个所有者;引用可以借用它,而不获取所有权。
| 操作 | 语法 |
|---|---|
| 移动(所有权转移) | let b = a;(a 不再有效) |
| 克隆(深拷贝) | let b = a.clone(); |
| 不可变借用 | let r = &x; |
| 可变借用 | let r = &mut x; |
| 在函数中借用 | fn read(s: &String) { ... } |
| 解引用 | *r |
| 借用规则 | 同一时间可以有多个 &,或者只有一个 &mut,两者不能并存 |
| 切片(借用一段范围) | let part = &arr[1..3]; |
结构体与枚举
结构体把相关数据组合在一起;枚举表示一个值是几种变体之一。
| 操作 | 语法 |
|---|---|
| 定义结构体 | struct Point { x: i32, y: i32 } |
| 创建实例 | let p = Point { x: 1, y: 2 }; |
| 访问字段 | p.x |
| 元组结构体 | struct Pair(i32, i32); |
| 方法(impl 块) | impl Point { fn dist(&self) -> f64 { ... } } |
| 关联函数 | impl Point { fn new() -> Self { ... } } |
| 定义枚举 | enum Shape { Circle(f64), Rect(f64, f64) } |
| 带命名字段的枚举 | enum Msg { Move { x: i32, y: i32 } } |
| 派生 trait | #[derive(Debug, Clone)] |
模式匹配(match)
match 把一个值和多个模式逐一比较,并且必须穷尽所有情况。
| 操作 | 语法 |
|---|---|
| 匹配值 | match x { 1 => "one", _ => "other" } |
| 匹配枚举 | match shape { Shape::Circle(r) => ... } |
| 匹配范围 | match n { 1..=5 => ..., _ => ... } |
| 绑定并加守卫条件 | match x { n if n > 0 => ... } |
| 匹配元组 | match point { (0, y) => ..., (x, _) => ... } |
| if let(单个模式) | if let Some(v) = opt { ... } |
| while let | while let Some(v) = stack.pop() { ... } |
| 解构结构体 | let Point { x, y } = p; |
Trait 与泛型
trait 定义共享的行为;泛型让代码适用于多种类型。
| 操作 | 语法 |
|---|---|
| 定义 trait | trait Area { fn area(&self) -> f64; } |
| 实现 trait | impl Area for Circle { fn area(&self) -> f64 { ... } } |
| 默认方法 | trait Greet { fn hi(&self) { ... } } |
| 泛型函数 | fn largest<T: PartialOrd>(list: &[T]) -> &T { ... } |
| 泛型结构体 | struct Wrapper<T> { value: T } |
| trait 约束(where) | fn f<T>(x: T) where T: Display { ... } |
| impl Trait 参数 | fn print(item: impl Display) { ... } |
| trait 对象 | let shapes: Vec<Box<dyn Area>> = ...; |
错误处理(Result / Option)
Rust 用 Option 表示值可能不存在,用 Result 表示可恢复的错误。
| 操作 | 语法 |
|---|---|
| 可选值 | Option<T>:Some(v) 或 None |
| Result 类型 | Result<T, E>:Ok(v) 或 Err(e) |
| 返回 Result | fn read() -> Result<String, Error> { ... } |
| 用 ? 向上传播 | let data = read()?; |
| unwrap(遇到 None/Err 会 panic) | opt.unwrap() |
| 默认值 | opt.unwrap_or(0) |
| 映射值 | opt.map(|v| v + 1) |
| 处理两种情况 | match res { Ok(v) => ..., Err(e) => ... } |
| 把 Option 转成 Result | opt.ok_or("missing")? |
常用集合(Vec / HashMap)
Vec 是可增长的数组;HashMap 是键值存储。
| 操作 | 语法 |
|---|---|
| 创建向量 | let mut v: Vec<i32> = Vec::new(); |
| 向量字面量 | let v = vec![1, 2, 3]; |
| push / pop | v.push(4);, v.pop(); |
| 按索引访问 | v[0] |
| 安全访问 | v.get(0) 返回 Option<&T> |
| 遍历 | for x in &v { ... } |
| 长度 | v.len() |
| 创建映射 | let mut m: HashMap<String, i32> = HashMap::new(); |
| 插入 / 获取 | m.insert(k, v);, m.get(&k) |
| Entry API | *m.entry(k).or_insert(0) += 1; |
最常用的 Rust 语法,全都在这一页。这份 Rust 速查表是核心语言的快速参考:变量和可变性、所有权和借用、结构体和枚举、模式匹配、trait 和泛型,以及 Rust 错误处理背后的 Result 和 Option 类型。
这里的内容都是标准 Rust,可以用较新的 stable 工具链编译。需要什么就复制什么,也可以在 Rust 在线编辑器里直接运行每个代码片段,无需安装 cargo。
Rust 速查表常见问题
这份 Rust 速查表免费吗?
免费。这份 Rust 速查表完全免费,无需注册。收藏起来,需要查 match 模式、trait 约束或集合方法时随时回来看。
Rust 中的所有权和借用是什么?
&x 是不可变借用,&mut x 是可变借用。编译器会强制执行一条规则:同一时间可以有多个不可变借用,或者只有一个可变借用,这样在编译阶段就能防止数据竞争。Rust 中的 Result 和 Option 有什么区别?
Option<T> 表示一个可能不存在的值,它要么是 Some(v),要么是 None;没有错误需要报告、只是可能缺少值时用它。Result<T, E> 表示一个可能失败的操作,它要么是 Ok(v),要么是 Err(e),出错时会带上错误值。“可能没有”用 Option,“可能失败”用 Result;? 运算符对两者都能向上传播。可以在线练习 Rust 吗?
可以。打开 Rust 在线编辑器,就能在浏览器里编译并运行这份速查表中的任何代码片段,无需安装 cargo 或工具链。想要系统学习的话,Coddy 的免费交互式 Rust 课程会带你从变量和所有权一步步学到 trait 和错误处理。
这份速查表适合初学者吗?
适合。内容从最常用的主题(变量、流程控制、函数)一直讲到进阶主题(trait、泛型、错误处理),第一天就能用上前面几部分,再慢慢掌握所有权和其余内容。