第1章 开始使用 Rust
按 原书第1章 Getting Started with Rust 一比一重建核心知识:Rust 的定位与价值、编译器与工具链安装、语言全景、单词计数器、编译器反馈闭环。
先做预测
先回答:示例能够编译并运行,是否已经证明设计正确?不能。编译成功只说明当前程序满足类型与语法约束,还要验证输入边界、失败路径、资源生命周期、并发或外部系统条件。是本章的起点,则把起点放进可重复的工程过程。
原书章节骨架
Packt 官方目录把本章组织为Rust 的定位与价值、编译器与工具链安装、语言全景、单词计数器、编译器反馈闭环。这里保留原书问题顺序,再把2019年前后的案例放到当前Rust工程语境中理解:概念不因crate版本变化而失效,但命令、依赖和框架API必须以当前项目锁定版本的官方文档为准。
官方核心单元核对:Rust的定位与价值;编译器与工具链安装;语言全景;修复单词计数器;编译器反馈闭环。
不是孤立语法。它承接Rust 的定位与价值给出的目标,并通过编译器与工具链安装进入真实项目。阅读代码时要沿着输入、所有权或状态、动作、结果和证据五个节点追踪,而不是只记函数名。
use std::collections::BTreeMap;
fn counts(input: &str) -> BTreeMap<String, usize> {
let mut out = BTreeMap::new();
for word in input.split_whitespace() {
*out.entry(word.to_lowercase()).or_insert(0) += 1;
}
out
}机制一:从类型到行为
Rust把内存安全、并发安全和接近底层的性能放在同一套静态规则中;价值不在语法新颖,而在让资源生命周期与可变性成为可检查契约。 rustup负责安装和切换工具链,rustc负责编译,cargo负责编排项目;验收安装不能只看版本号,还要编译、运行并删除一个最小程序。 两者协作时,先写出谁拥有数据、谁可以修改、失败由谁处理,再决定具体API。这样可以把编译器诊断还原为契约冲突,而不是把错误信息当成需要逐条消除的噪声。
进一步约束运行行为。它说明“类型正确”与“协议正确”是两层证据:前者由编译器帮助证明,后者还需要测试、时间线和边界输入。
fn main() {
let text = String::from("rust makes state explicit");
let borrowed = text.as_str();
println!("{} {}", borrowed, text.len());
}机制二:失败、资源与边界
变量默认不可变,match要求穷尽,Result显式承载失败,所有权决定值何时移动或借用;这些规则共同把运行期隐患提前到编译期。 原书用修复单词计数器串起输入、字符串处理、映射聚合与错误反馈;正确性边界包括Unicode分词、大小写规则、空输入和稳定输出。 失败实验至少覆盖正常、空值或零长度、上限附近、显式错误和资源中断。涉及线程、网络、数据库、GUI或FFI时,还要加入超时、取消、部分完成与关闭路径。
不要把原书示例的依赖版本直接复制到新项目。先固定Rust edition与最小支持版本,再查询维护中的crate文档和迁移说明;保留原书要讲的架构边界,按当前API重写适配层。
rustup show
rustc --edition 2021 main.rs
./main机制三:可复现证据
负责把本章收束成证据。Rust学习的关键闭环是先预测所有权和类型,再编译读取诊断,最后做最小修改并用测试证明语义,而不是逐条压制错误信息。 一次可靠验收要保存输入、工具链、依赖锁定、命令、退出状态、关键输出和失败样本。性能结论还要记录release构建、样本数与环境噪声;并发结论则要记录任务边界、超时和关闭结果。
验收清单
- 在隔离目录运行三段示例,先预测结果和所有权变化,再记录实际编译诊断。
- 为主路径增加一个正常测试和至少三个边界测试,错误断言检查类别与上下文,而不只匹配整段文本。
- 清理构建产物后重跑,确认没有依赖本地缓存、环境变量或未声明工具。
- 若章节涉及外部系统,使用本地测试服务或临时数据库,设置时间预算并验证资源最终释放。
常见误区
本章回顾
本章按照官方目录逐项覆盖Rust 的定位与价值、编译器与工具链安装、语言全景、单词计数器、编译器反馈闭环。核心方法是先用类型表达资源与能力,再用运行期协议约束超时、顺序和外部失败,最后用测试、日志或调试记录证明结果可重复。