Rust 编程语言
一份全面的 Rust 入门指南,涵盖系统编程概念、内存安全、并发以及 Rust 工具链(Cargo、rustup)。课程从基础语法逐步过渡到构建完整项目,例如一个多线程网络服务器。
课程概述
📚 内容概要
一本全面的 Rust 入门指南,涵盖系统编程概念、内存安全、并发编程以及 Rust 工具链(Cargo、rustup)。内容从基础语法逐步过渡到构建完整项目,例如一个多线程网络服务器。
掌握安全、高效且并发的系统编程艺术,尽在 Rust 的权威指南。
作者: 斯蒂夫·克拉布尼克(Steve Klabnik)和卡罗尔·尼科尔斯(Carol Nichols),并由 Rust 社区贡献
致谢: 感谢 Rust 社区的贡献;由 No Starch Press 出版,提供平装本和电子书格式。
🎯 学习目标
- 成功使用
rustup在不同操作系统上安装和管理 Rust 工具链。 - 编写、编译并运行一个基本的 Rust 程序,识别代码的核心结构组件。
- 使用 Cargo 创建标准化项目结构,管理构建过程,并生成优化的发布版本二进制文件。
- 捕获并存储用户输入,同时处理变量可变性及潜在的 I/O 失败。
- 使用 Cargo 集成外部依赖,并通过
Cargo.lock管理可复现的构建。 - 使用类型推断、字符串解析、循环和
match控制流操作符实现游戏逻辑。 - 区分常量与变量遮蔽,以管理数据不可变性和作用域。
- 正确实现标量类型(整数、浮点数、布尔值、字符)和复合类型(元组、数组)。
- 区分语句与表达式,以定义具有特定返回值的函数。
- 区分栈内存与堆内存,并解释 Rust 如何管理堆上的数据。
🔹 第 1 课:开始使用 Rust
概述: 本课程为 Rust 生态系统提供全面介绍,重点在于环境配置和 Rust 开发者的根本工作流程。学生将从通过 rustup 安装语言开始,编写手动的“Hello, World!”程序,最终掌握 Cargo——Rust 官方构建系统和包管理器,用于专业级项目管理和发布优化。
学习成果:
- 成功使用
rustup在不同操作系统上安装和管理 Rust 工具链。 - 编写、编译并执行一个基本的 Rust 程序,识别代码的核心结构组件。
- 使用 Cargo 创建标准化项目结构,管理构建过程,并生成优化的发布版本二进制文件。
🔹 第 2 课:动手实践:编写猜数字游戏
概述: 本课程指导开发者在 Rust 中构建一个功能完整的基于命令行的猜数字游戏。内容涵盖用户输入处理、集成外部库(crates)进行随机数生成等基础系统编程概念,以及 Rust 通过 Result 类型和模式匹配实现的内存安全与错误处理机制。学习结束后,学员将拥有一个能够处理无效输入并确保构建可复现性的健壮应用程序。
学习成果:
- 捕获并存储用户输入,同时管理变量可变性及潜在的 I/O 失败。
- 使用 Cargo 集成外部依赖,并通过
Cargo.lock管理可复现的构建。 - 使用类型推断、字符串解析、循环和
match控制流操作符实现游戏逻辑。
🔹 第 3 课:常见编程概念
概述: 本课程涵盖 Rust 编程的基础构建模块,聚焦于数据的存储与操作方式。内容包括变量遮蔽与常量的细微差别、数据分类为标量与复合类型、函数的结构规则,以及控制流和重复执行的逻辑。
学习成果:
- 区分常量与变量遮蔽,以有效管理数据不可变性和作用域。
- 正确实现标量类型(整数、浮点数、布尔值、字符)和复合类型(元组、数组)。
- 区分语句与表达式,以定义具有特定返回值的函数。
🔹 第 4 课:理解所有权与内存
概述: 本课程探讨 Rust 通过其所有权系统对内存管理的独特方法。不同于依赖垃圾回收或手动内存管理,Rust 通过在编译时检查的一组规则来确保内存安全。本部分内容涵盖栈与堆的机制、数据生命周期,以及引用和切片如何在不转移所有权的情况下提供安全高效的内存访问。
学习成果:
- 区分栈内存与堆内存,并解释 Rust 如何管理堆上的数据。
- 应用所有权的三条规则,预测变量的有效性和作用域。
- 展示移动(Move)、克隆(Clone)和复制(Copy)操作之间的区别。
🔹 第 5 课:结构体:管理相关数据
概述: 本课程探讨如何使用结构体(structs)将相关数据组合成自定义类型,从而编写更具意义和条理性的代码。内容涵盖各种结构体形式(经典结构体、元组结构体、单位结构体)的定义与实例化、这些结构体内数据所有权的管理,以及通过派生特性(如 Debug)和 impl 块定义的自定义方法增强结构体功能。
学习成果:
- 使用命名字段、简写语法和更新语法定义和实例化结构体。
- 区分经典结构体、元组结构体和单位结构体,并识别各自的使用场景。
- 实现
Debug特性并使用dbg!宏检查结构体数据。
🔹 第 6 课:枚举与模式匹配
概述: 本课程探讨 Rust 如何使用枚举(enums)通过列举可能的变体来定义类型,提供了比仅使用结构体更灵活的方式来组织相关常量和数据。内容涵盖 Option 枚举在消除空指针错误中的关键作用,以及 match 和 if let 构造如何提供强大且完备的控制流,以安全地处理复杂数据模式。
学习成果:
- 使用
impl块为枚举定义多种数据类型和方法。 - 解释
Option<T>枚举相比传统空值的安全优势。 - 构建完备的
match表达式,绑定内部变体值,并使用通配占位符。
🔹 第 7 课:模块、包与仓库
概述: 本课程探讨 Rust 如何通过其模块系统组织代码以提高可读性和可重用性。内容涵盖模块树的创建、隐私规则的应用以控制项的可见性,以及路径和关键字(如 use 与 pub)的使用,以管理作用域并创建清晰的 API。
学习成果:
- 使用模块和模块树将代码组织为层次化结构。
- 使用绝对路径和相对路径引用代码项。
- 使用
pub关键字和隐私规则控制函数、模块和字段的可见性。
🔹 第 8 课:常用集合
概述: 本课程探讨 Rust 标准库中的集合,特别是向量(Vectors)、字符串(Strings)和哈希映射(Hash Maps)。这些数据结构存储在堆上,允许在运行时动态增长或收缩。课程详细说明了 Rust 所有权与借用规则如何在管理这些值列表、UTF-8 文本和键值关联时确保内存安全和性能。
学习成果:
- 使用
Vec<T>实现动态列表,并通过借用检查器管理其生命周期。 - 使用
String类型操作 UTF-8 编码文本,同时应对内部表示和拼接的复杂性。 - 使用
HashMap<K, V>高效存储和更新关联数据,利用 Entry API 和自定义哈希考虑。
🔹 第 9 课:错误处理策略
概述: 本课程探讨 Rust 强大的错误处理理念,区分可恢复错误与不可恢复错误。学生将学习使用 panic! 宏处理致命缺陷,使用 Result 枚举处理可管理的失败,以及使用 ? 操作符简化错误传播。此外,课程还涵盖如何利用 Rust 的类型系统强制数据验证,保持程序完整性。
学习成果:
- 根据“异常状态”标准判断何时使用不可恢复的
panic!或可恢复的Result。 - 利用调用栈追踪调试不可恢复错误的来源。
- 使用
?操作符实现错误传播,并修改main函数以支持错误返回。
🔹 第 10 课:泛型、特质与生命周期
概述: 本课程探讨 Rust 用于有效抽象的工具:泛型用于减少跨类型代码重复,特质用于定义共享行为(接口),生命周期用于在无需手动管理的情况下确保内存安全。这三项功能共同使开发者能够编写高性能、可重用的代码,这些代码由编译器验证,防止悬垂引用和类型不匹配。
学习成果:
- 在函数、结构体和枚举中定义和使用泛型类型参数,以处理多种数据类型。
- 使用特质和特质边界实现共享行为,并约束泛型类型。
- 应用生命周期注解和省略规则,管理引用有效性并满足借用检查器要求。
🔹 第 11 课:编写自动化测试
概述: 本课程探讨 Rust 中自动化测试的实现与组织。内容涵盖测试函数的结构要求、使用断言宏验证逻辑,以及单元测试与集成测试的技术差异。学习者还将了解如何控制 Rust 测试运行器的行为,以管理执行流程和输出可见性。
学习成果:
- 定义有效的 Rust 测试函数所需的结构和元数据。
- 实现相等性检查和恐慌状态验证,以确保代码可靠性。
- 配置测试运行器以实现并行或顺序执行,并控制程序输出的可见性。
🔹 第 12 课:I/O 项目:命令行工具
概述: 本课程指导开发者使用 Rust 构建一个功能完整的命令行工具(简化版的 grep)。内容聚焦于从单文件脚本过渡到模块化、生产就绪的二进制文件,强调内存安全的参数解析、文件输入输出,以及库逻辑与命令行界面之间的关注点分离。学习者将实现稳健的错误处理,并通过测试驱动开发(TDD)实现新功能,同时通过环境变量管理应用状态。
学习成果:
- 将命令行参数捕获并转换为结构化的配置对象。
- 重构代码以遵循“关注点分离”原则,适用于二进制项目。
- 使用测试驱动开发(TDD)周期实现核心逻辑,包含生命周期注解。
🔹 第 13 课:函数式特性:迭代器与闭包
概述: 本课程探讨 Rust 的函数式编程特性,特别是闭包和迭代器。闭包是能捕获其环境的匿名函数,受 Fn 特质控制;而迭代器则提供一种惰性、高效的序列处理方式。这两项功能共同使得代码表达力强,符合 Rust 的“零成本抽象”原则,通常性能可媲美甚至超越传统循环。
学习成果:
- 定义匿名函数(闭包),并解释它们如何通过借用或移动捕获环境中的变量。
- 区分三种
Fn特质(Fn、FnMut、FnOnce),理解编译器如何推断闭包类型。 - 使用
next方法实现Iterator特质,并区分消耗型适配器与迭代器适配器。
🔹 第 14 课:高级 Cargo 与 Crates.io
概述: 本课程探讨 Rust 包管理器 Cargo 及其生态系统 Crates.io 的高级功能。内容聚焦于通过发布配置优化构建,使用集成测试生成专业级文档,以及掌握公共 API 的架构设计。此外,还涵盖一个仓库的生命周期——从发布与版本管理,到通过工作区(workspaces)管理多包项目,以及扩展 Cargo 的原生功能。
学习成果:
- 配置发布配置文件,平衡编译速度与运行时性能。
- 生成并验证文档注释,使其既作为用户指南,又作为自动测试。
- 使用重新导出(
pub use)设计便捷的公共 API,将内部结构与外部使用解耦。
🔹 第 15 课:智能指针
概述: 本课程探讨 Rust 的智能指针——一种类似指针但携带额外元数据和功能的数据结构。我们重点关注使用 Box<T> 管理堆分配,使用 Rc<T> 实现共享所有权,以及使用内部可变性模式绕过严格的借用规则,配合 RefCell<T>。此外,还涵盖 Deref 与 Drop 特质,它们支撑智能指针行为与资源清理。
学习成果:
- 使用
Box<T>实现递归数据结构,提供间接访问和已知内存大小。 - 使用
Deref与Drop特质自定义指针行为与资源管理。 - 通过结合
Rc<T>与RefCell<T>管理多个所有者和运行时检查的可变性。
🔹 第 16 课:无畏并发
概述: 本课程探讨 Rust 的“无畏并发”哲学,展示语言如何利用其所有权和类型系统,将并发编程从运行时的雷区转变为编译时的确定性。内容涵盖线程创建、通过消息传递实现安全通信、使用互斥锁管理共享状态,以及定义线程安全的基本特质。
学习成果:
- 使用
spawn与join创建和管理线程,通过move关键字解决所有权冲突。 - 使用
mpsc通道实现消息传递并发,安全地在线程间传递数据。 - 使用
Mutex<T>实现互斥以管理多线程间的共享状态,使用Arc<T>实现线程安全的引用计数。
🔹 第 17 课:Rust 中的面向对象编程
概述: 本课程探讨 Rust 如何实现核心面向对象编程(OOP)原则,特别聚焦于封装与多态。内容详述了使用特质对象处理异构集合的机制,以及静态分派与动态分派之间的权衡。最后,将经典的“状态模式”实现与更符合 Rust 风格的方法进行对比——即直接将状态和行为编码进类型系统。
学习成果:
- 使用模块和可见性修饰符在 Rust 中实现封装,隐藏内部状态。
- 使用特质对象实现多态,并理解静态分派与动态分派的性能影响。
- 应用状态模式管理复杂对象行为并实现状态转换。
🔹 第 18 课:高级模式与匹配
概述: 本课程深入探讨 Rust 的模式匹配系统,超越简单的 match 分支,进入复杂的数据提取与控制流。学生将掌握不可反驳模式与可反驳模式的区别,学会解构复杂的嵌套结构,并利用高级语法如匹配守卫和绑定,写出更具表现力且安全的代码。
学习成果:
- 区分不可反驳模式与可反驳模式,并将其应用于正确的 Rust 构造(如
let与if let)。 - 解构结构体、枚举和元组,将特定数据提取到局部变量中。
- 使用高级模式语法,包括范围、多重模式、忽略值、
@绑定,以实现复杂的条件匹配。
🔹 第 19 课:高级特性与不安全 Rust
概述: 本课程探讨 Rust 的“超级能力”,允许开发者绕过某些编译器限制,创建高度灵活的抽象。内容涵盖使用不安全 Rust 进行低级别内存操作,使用高级特质技术处理复杂类型关系,以及声明式与过程式宏的强大元编程能力。
学习成果:
- 区分安全 Rust 与需要原始指针操作和调用不安全函数的“不安全”超级能力。
- 实现高级特质模式,包括关联类型、运算符重载、超特质和新类型模式。
- 使用完全限定语法区分方法调用,并管理复杂类型如动态大小类型(DST)和类型别名。
🔹 第 20 课:最终项目:多线程网络服务器
概述: 本课程指导开发一个高性能网络服务器,使用 Rust 的网络与并发原语。内容涵盖从基本的 TCP 监听器过渡到利用自定义线程池的复杂多线程系统。学生将学习管理低级别流、实现基于工作线程的消息传递以分发任务,并通过优雅关闭机制确保系统稳定性。
学习成果:
- 建立并管理 TCP 连接:绑定服务器到本地端口,处理传入的字节流。
- 解析并响应 HTTP:读取原始请求数据,并构造包含状态行和 HTML 正文的有效 HTTP 响应。
- 架构自定义线程池:使用
mpsc通道和同步原语(Arc、Mutex)在有限数量的线程之间分发任务。
🔹 第 21 课:Rust 附录:工具与参考
概述: 本课程提供 Rust 编程语言的综合性技术参考,聚焦于其密集的语法、自动化开发工具以及演进的发布流程。学生将学习如何导航 Rust 的符号密集语法,通过可推导特质实现标准行为,并利用生态系统的工具链维护高代码质量,遵循语言“稳定而不僵化”的理念。
学习成果:
- 识别并解读语法:使用标准化参考表解码 Rust 的运算符、路径相关符号和泛型约束。
- 实现标准行为:通过
derive属性自动实现Debug、Clone、Eq、Ord和Hash特质。 - 优化开发工作流:使用
rustfmt、rustfix和Clippy按照社区标准格式化、修复和检查代码。