跳到主要内容

Rust 语法速查:从所有权到 cargo 命令的日常查阅清单

一份按场景查的 Rust 速查,讲清变量、所有权、借用、match、Option、Result、结构体这些日常高频语法,把所有权当核心理解,配 cargo 常用命令,写代码时随手翻。

发布于 作者 李雷
#Rust #速查表 #所有权 #编程

Rust 语法速查:把所有权当核心,按场景查就够用

学 Rust 最容易卡住的不是语法本身,而是借用检查器。一段在别的语言里随手就写的代码,到 Rust 里编译器会一行行打回。这篇按场景整理日常最高频的语法,讲清为什么所有权是理解 Rust 的核心,顺手把 cargo 命令也列上,写代码时直接对照查。

变量:默认不可变,要改得显式声明

Rust 的变量默认不可变,这点和大多数语言相反。想改值得加 mut:

let x = 5;          // 不可变,再赋值会编译报错
let mut y = 5;      // 可变
y = 6;
let x = x + 1;      // 变量遮蔽,允许同名重新绑定

变量遮蔽(shadowing)和 mut 不是一回事。遮蔽是用 let 重新声明同名变量,可以顺带换类型;mut 是原地改同一个变量的值。日常写代码,能用不可变就别加 mut,编译器帮你挡掉一类误改。

所有权:整个语言的地基

所有权是 Rust 区别于其它语言最核心的一条,搞懂它,后面的报错大半能自己解。三条规则:每个值有且只有一个所有者;所有者离开作用域,值被丢弃;值默认 move 转移,而不是拷贝。

let s1 = String::from("hi");
let s2 = s1;        // s1 被 move 给 s2,s1 之后不能再用
// println!("{s1}"); // 这行编译不过

StringVec 这类堆上数据,赋值是 move 不是 copy。整数、bool、char 这些实现了 Copy 的类型才是真拷贝。很多新手第一反应是到处 .clone() 把编译器糊弄过去,但 .clone() 通常在掩盖真正该想清楚的问题:这块数据到底该归谁拥有。

借用:不转移所有权地用一下

不想交出所有权,又想用一下值,就用借用,也就是引用。借用分两种:

fn read(s: &String) {}      // &T 共享借用,可以有多个
fn write(s: &mut String) {} // &mut T 独占借用,同一时刻只能有一个

借用检查器的两条铁律:同一时刻,要么有任意多个共享借用,要么只有一个独占借用,二者不能同时存在。这条规则在编译期就堵死了数据竞争。比如对一个 Vec 边遍历边 push,在 C++ 里是 use-after-free,在 Rust 里直接编不过,这正是借用检查器替你挡下的事故。

match、Option、Result:Rust 处理分支和错误的主力

match 必须穷尽所有分支,编译器会盯着你有没有漏。配合 OptionResult,Rust 把 null 和异常这两个老问题从语言层面收编了:

let maybe: Option<i32> = Some(3);
match maybe {
    Some(n) => println!("有值 {n}"),
    None => println!("空"),
}

fn parse(s: &str) -> Result<i32, std::num::ParseIntError> {
    let n: i32 = s.parse()?;   // ? 运算符:出错就提前返回
    Ok(n * 2)
}

? 运算符是日常写错误处理最常用的一个字符,它替代了一整段 match 加提前 return。函数返回 Result,每个可能失败的调用后面跟一个 ?,出错自动往上抛,成功就解包继续往下。

结构体:组织数据的基本单元

结构体用 struct 定义,通常配一个 new() 关联函数做构造,带数据的枚举则用来表达"几种互斥状态之一":

struct User {
    name: String,
    age: u32,
}
impl User {
    fn new(name: String, age: u32) -> Self {
        Self { name, age }
    }
}

enum Shape {
    Circle(f64),
    Rect { w: f64, h: f64 },
}

常用的 derive#[derive(Debug, Clone, PartialEq)] 能自动生成调试打印、克隆、比较这些实现,省掉一堆样板代码。

cargo 命令:每天都在敲的几条

Rust 的工程几乎都围着 cargo 转,记住这几条基本够用:

cargo new my_app      # 新建项目
cargo build           # 编译(debug)
cargo build --release # 编译优化版
cargo run             # 编译并运行
cargo test            # 跑测试
cargo check           # 只检查不生成产物,最快
cargo clippy          # 静态检查,挑代码毛病
cargo fmt             # 格式化

写代码循环里我用得最勤的是 cargo check,它不生成可执行文件,只过一遍类型和借用检查,比 cargo build 快很多,改一点查一下,反馈飞快。

我自己的一点体会

我从 Go 迁过一个 JSON 摄取服务到 Rust,头两天几乎全在跟借用检查器较劲,几十行在 Go 里没问题的代码全被打回。后来发现绝大多数报错根子是同一个:我在该想清楚所有权归属的地方,图省事 .clone() 一把蒙混。把所有权那几条规则真正读进去之后,报错肉眼可见地少了。所以我的建议很直接,别绕开所有权,它就是 Rust 的核心,前期多花两小时,后面省一周。

这些语法日常查,一份能搜索、能按分类筛的速查表比翻书快得多。完整版我整理在 Rust 速查表,100 多段都是真在生产里撸的代码,支持按所有权、借用、生命周期、trait、async 这些分类筛。如果你也在跨语言搬代码,对照看一眼 Go 速查表,两边语义放一起,迁移时哪里不一样一目了然。


Made by Toolora · Updated 2026-06-13