三入三废的Rust的入门
前言
Rust 连续多年在 Stack Overflow 的"最受喜爱语言"调查中排第一,但同样有名的还有它的学习曲线。我从 2023 年开始,前后三次打开 The Rust Book,又三次关上——直到最近才终于摸到了一点门道。这篇文章记录我反复放弃又重新开始的过程,以及这次觉得终于"入门了"的几个关键点。
为什么要学 Rust
对我个人而言,有几个朴素的动机:
- 写过高并发服务被 GC 停顿坑过:Rust 无 GC 的内存安全保证,解决了"要性能还是安全"的两难
- Cargo 生态太舒服了:一个命令搞定构建、依赖、测试、发布,比 C++ 的 CMake 地狱友好太多
- 类型系统的安全感:Rust 的类型系统让很多 bug 在编译期就被拦截,而不是半夜被报警叫起来排查
三次放弃的心路历程
第一次:所有权直接劝退
第一次翻开 The Rust Book,前三章还挺舒服——语法挺现代的,变量默认不可变,模式匹配很优雅。到 第四章 所有权那里,一切戛然而止。
fn main() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1); // 编译错误!
}
我真的愣住了,心想"凭什么赋值一下就把原变量废了?"——后来才明白这是 Rust 所有权转移(move) 的核心,目的是在编译期就标记哪些内存只能有一个 owner。当时理解不了这套心智模型,就放弃了。
第二次:生命周期劝退
几个月后又鼓起勇气再读,这次咬着牙过了所有权。但到了生命周期标注,再次崩溃:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
'a 是什么?为什么需要手动标?编译器不是能推导生命周期吗?——实际上编译器有时候确实搞不清返回的引用到底来自哪个参数,需要人工标注来约束。但当时的我不理解背后的借用检查器逻辑,只觉得是在和编译器打架。
第三次:终于入门的转折点
第三次回头学 Rust 时,我换了一个策略:不要试图一次性理解所有概念,先写能跑的代码。
- 先用
clone()绕过所有权问题,不要怕"不高效"的批评 - 先去写小工具,不要一上来就写高性能库
- 遇到生命周期错误,先把 struct 改成存 owned 类型(
String而非&str)
写了几百行能跑的代码之后,回过头再看所有权和借用——忽然觉得设计得很有道理:编译器不是在刁难你,它在帮你管理内存。
Rust 的核心心智模型:三条铁律
入门之后回头看,Rust 的核心约束其实就三条:
- 一个值同时只能有一个 owner
- 同一时刻,要么一个可变引用,要么多个不可变引用——二者不能共存
- 引用必须始终有效(由生命周期保证)
理解了这三条,Rust 的大部分编译错误都能解释了。
推荐的学习路径(如果你也想入门)
- The Rust Book(前六章必读):官方入门书,质量非常高,每一章都可以在浏览器里直接运行示例
- Rustlings:交互式练习项目,通过修改代码让测试通过来学习,非常适合动手党
- Rust By Example:通过实例学习语法和标准库用法
- Exercism Rust Track:有 mentor review 的练习题,能获得社区反馈
这次能坚持多久
这次写个 flag——至少读完 The Rust Book 全书,再用 Rust 写一两个自己能用的工具。Rust 的学习曲线确实陡峭,但跨过那道坎后,收获的是一种前所未有的"编译器帮我兜底"的踏实感。
持续学习中,后续会更新学习笔记…