三入三废的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 的核心约束其实就三条:

  1. 一个值同时只能有一个 owner
  2. 同一时刻,要么一个可变引用,要么多个不可变引用——二者不能共存
  3. 引用必须始终有效(由生命周期保证)

理解了这三条,Rust 的大部分编译错误都能解释了。

推荐的学习路径(如果你也想入门)

  1. The Rust Book(前六章必读):官方入门书,质量非常高,每一章都可以在浏览器里直接运行示例
  2. Rustlings:交互式练习项目,通过修改代码让测试通过来学习,非常适合动手党
  3. Rust By Example:通过实例学习语法和标准库用法
  4. Exercism Rust Track:有 mentor review 的练习题,能获得社区反馈

这次能坚持多久

这次写个 flag——至少读完 The Rust Book 全书,再用 Rust 写一两个自己能用的工具。Rust 的学习曲线确实陡峭,但跨过那道坎后,收获的是一种前所未有的"编译器帮我兜底"的踏实感。


持续学习中,后续会更新学习笔记…