Skip to content

参考:Rust 核心概念、所有权规则与智能指针速查

基于进阶语言 · 核于 2026-08

速查

  • 定位:内存安全 + 并发安全的系统级语言,编译期消除内存错误,无 GC,性能媲美 C/C++。
  • 所有权三规则:唯一所有者 + 作用域结束自动释放 + 赋值/传参默认 move(Copy 类型则栈拷贝)。
  • 借用铁律:多个 &T 或一个 &mut T,不可共存;引用必须有效(不可悬垂)。
  • 生命周期 'a:描述引用关系,确保引用不比被引用者长寿;'static 活整个程序。
  • 错误处理Result<T, E> + ?,无异常;Option<T> 表可能无值;panic! 是不可恢复。
  • 泛型:单态化,零成本;dyn Trait 动态分发(虚表)。
  • 智能指针Box(独占堆)、Rc(单线程引用计数)、Arc(多线程原子引用计数)、RefCell/Mutex(内部可变性)。
  • Cargocheck/build/run/test/fmt/clippy;edition 2015/2018/2021/2024。
  • WASMwasm32-unknown-unknown 一等 target,配合 wasm-bindgen/wasm-pack。
  • 前端 RIIR:SWC(~20×)、Turbopack(~10×)、Biome(~25×)、Ruff(~100×)、Oxc、rolldown。

一、所有权规则速查

规则内容违反后果
唯一所有者每个值有且仅有一个所有者编译错误
自动释放所有者离开作用域 → 调用 Drop
默认 move赋值/传参转移所有权,原变量失效用了失效变量 → 编译错误
Copy trait栈上拷贝,原变量仍可用(i32/bool/&T
借用规则多个 & 或一个 &mut,不可共存编译错误
引用有效引用不可悬垂(不比被引用者长寿)编译错误
rust
// move
let s1 = String::from("hi");
let s2 = s1;
// s1 已失效

// Copy
let a = 5;
let b = a;   // a 仍可用

// 借用
let mut s = String::from("hi");
let r1 = &s;
let r2 = &s;      // ✅ 多个不可变
// let r3 = &mut s; // ❌ 与 r1/r2 冲突

二、借用与可变性对照

形式可变性数量场景
&T不可变多个只读共享
&mut T可变唯一修改值
*const T不可变裸指针(unsafe)
*mut T可变裸指针(unsafe)

借用检查器在编译期静态分析,通过则运行时绝不违反。

三、智能指针对比

智能指针用途借用检查线程计数方式
Box<T>独占堆分配编译期独占(无计数)
Rc<T>多所有者(单线程)编译期非原子引用计数
Arc<T>多所有者(多线程)编译期原子引用计数
RefCell<T>内部可变性(单线程)运行期无(运行期借用计数)
Mutex<T>内部可变性(多线程,互斥)运行期
RwLock<T>内部可变性(多线程,读写锁)运行期
Cell<T>Copy 类型的内部可变性编译期无(按值拷贝)
Weak<T>弱引用(防循环泄漏)编译期Rc/Arc不增 strong count

组合模式

  • 单线程共享可变:Rc<RefCell<T>>
  • 多线程共享可变:Arc<Mutex<T>>Arc<RwLock<T>>

四、错误处理速查

类型含义用法
Result<T, E>可恢复错误(成功 T / 失败 E)match?.unwrap().expect()
Option<T>可能有值(Some / None)match?.unwrap_or(default)
? 运算符提前返回错误fn f() -> Result<T, E>x?
panic!不可恢复断言失败/越界/显式 panic
rust
use std::fs;

fn read_num() -> Result<i32, std::io::Error> {
    let s = fs::read_to_string("n.txt")?;  // 失败提前 return
    Ok(s.trim().parse().unwrap_or(0))
}

五、trait 与泛型速查

概念写法说明
定义 traittrait T { fn m(&self); }类似接口
实现 traitimpl T for S { fn m(&self) {} }
trait boundfn f<T: T>(x: T)泛型约束
impl Traitfn f(x: impl T)bound 简写
返回 impl Traitfn f() -> impl T静态分发(编译期知具体类型)
trait objectBox<dyn T> / &dyn T动态分发(虚表)
关联类型trait T { type Item; }一个 trait 一个关联类型
默认方法fn m() { /* 默认 */ }可被覆盖
marker traitSend/Sync/Sized/Copy无方法,标记属性

六、Cargo 命令速查

命令作用
cargo new NAME创建二进制项目
cargo new NAME --lib创建库
cargo check类型检查(开发首选,快)
cargo build编译(debug)
cargo build --release优化编译
cargo run编译 + 运行
cargo test跑所有测试
cargo fmt格式化
cargo clippylint
cargo doc --open生成文档
cargo add NAME加依赖
cargo update升级依赖(受 semver 约束)
cargo publish发布到 crates.io
cargo fix --edition自动迁移 edition

七、Rust vs C/C++ vs Go 速查

维度RustC/C++Go
内存安全编译期(所有权)靠人工GC(运行期)
并发安全编译期(Send/Sync)靠人工CSP(channel)+ 运行期
内存回收确定性(RAII)手动/RAIIGC(有停顿)
运行时有(GC + 调度器)
性能≈ C/C++巅峰略低于 Rust/C++
编译速度慢(C++)/快(C)极快
学习曲线陡(所有权)陡(UB/模板)平缓
错误处理Result/Option异常/错误码error(值)+ panic
泛型单态化模板1.18+ 泛型(单态化+GC)
二进制静态/动态静态/动态静态(默认)

八、易错点清单

  • 「Rust 有 GC」:错。Rust 无 GC,靠所有权 + RAII 确定性回收,无 STW 停顿。
  • clone() 是免费的」:错。clone() 多为深拷贝,有分配开销,应避免在热路径滥用。
  • 「多个 & 和一个 &mut 可以同时」:错。这是借用铁律,违反即编译错误(数据竞争的根源)。
  • 「Rust 完全内存安全」:不完全。unsafe 块可绕过检查(FFI、裸指针、底层数据结构),但 unsafe 是局部的。
  • Rc 可以跨线程」:错。Rc 非原子,跨线程用 Arc(否则编译错误,Rc 未实现 Send)。
  • 「泛型有运行时开销」:错。单态化在编译期为每类型生成专用代码,零开销;有开销的是 trait object(dyn)。
  • ? 是异常」:错。? 是提前返回错误的语法糖,仍是普通控制流(return),不是异常。
  • 「生命周期标注改变引用寿命」:错。'a 只描述关系,不改变实际寿命;是编译器验证用的标注。
  • Box 是引用计数」:错。Box 是独占堆指针(无计数);引用计数的是 Rc/Arc
  • 「Cargo 是包管理器」:不完整。Cargo 是构建系统 + 包管理器 + 测试 + 文档 + 发布的一体化工具链。
  • 「edition 是版本号」:错。edition(2015/2018/2021/2024)是语言特性集合,非破坏性升级,老代码仍能编译。
  • 「Rust 编译慢是因为 LLVM」:不全是。主要因单态化为每类型生成代码(代码膨胀),LLVM 优化耗时是次要。

九、进阶方向(链接其他叶)

  • Go —— 简单派代表,与 Rust「安全派」对照(简单 vs 安全、GC vs 所有权、CSP vs Send/Sync)

权威链接