commit 3dc26f670c07166087726f82160348ea93d27280 Author: 程广 Date: Wed Jul 2 17:11:54 2025 +0800 添加Rust学习笔记前两章内容:Rust初体验和所有权系统详解 diff --git a/01.md b/01.md new file mode 100644 index 0000000..f9ceaaa --- /dev/null +++ b/01.md @@ -0,0 +1,196 @@ +# 第一章 Rust初体验:开启系统编程新纪元 + +## 1.1 Rust语言概览 +Rust是一门专注于**安全、并发和性能**的现代系统编程语言。由Mozilla研究院开发,自2015年稳定版发布以来,迅速成为开发者最喜爱的语言之一。其独特的所有权系统在编译期消除内存错误,零成本抽象提供C/C++级别的性能,而现代化的工具链则让开发体验异常流畅。 + +## 1.2 安装Rust工具链 + +### 跨平台安装指南 +Rust提供了简单的一键安装脚本,支持Windows、macOS和Linux: + +```bash +# 在终端中执行安装命令 +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +安装过程包含: +1. Rust编译器(rustc) +2. 包管理器Cargo +3. 工具链管理器rustup +4. 标准库文档 + +### 验证安装 +安装完成后,重启终端并运行: + +```bash +rustc --version +cargo --version +rustup --version +``` + +正常输出类似: +``` +rustc 1.78.0 (9b00956e5 2024-04-29) +cargo 1.78.0 (54d8815d0 2024-03-26) +rustup 1.27.2 (xxx) +``` + +## 1.3 第一个Rust程序:Hello, Rust! + +### 创建项目 +使用Cargo创建新项目: + +```bash +cargo new hello_rust +cd hello_rust +``` + +项目结构: +``` +hello_rust/ +├── Cargo.toml # 项目配置和依赖声明 +└── src/ + └── main.rs # 程序入口文件 +``` + +### 编写代码 +打开`src/main.rs`文件,输入: + +```rust +fn main() { + println!("Hello, Rust!"); +} +``` + +代码解析: +- `fn main()`:程序入口函数 +- `println!`:宏调用(注意感叹号标识) +- 行尾分号`;`:语句结束符 + +### 运行程序 +在项目根目录执行: + +```bash +cargo run +``` + +输出结果: +``` + Compiling hello_rust v0.1.0 (/path/to/hello_rust) + Finished dev [unoptimized + debuginfo] target(s) in 0.58s + Running `target/debug/hello_rust` +Hello, Rust! +``` + +## 1.4 Cargo:Rust的瑞士军刀 +Cargo不仅是构建工具,还是包管理器和项目脚手架: + +| 命令 | 功能 | 示例 | +|------|------|------| +| `cargo new` | 创建新项目 | `cargo new project_name` | +| `cargo build` | 编译项目 | `cargo build --release` | +| `cargo run` | 编译并运行 | `cargo run` | +| `cargo check` | 快速检查错误 | `cargo check` | +| `cargo update` | 更新依赖 | `cargo update` | +| `cargo doc` | 生成文档 | `cargo doc --open` | + +## 1.5 探索Rust文档生态系统 + +### 官方文档门户 +[Rust官方文档](https://www.rust-lang.org/learn) 包含: +- 《The Rust Programming Language》("The Book") +- 《Rust by Example》 +- 《The Cargo Book》 +- 《The rustc Book》 + +### 本地文档查看 +安装时自带的离线文档可通过命令打开: + +```bash +rustup doc +``` + +### 标准库文档 +访问 [std](https://doc.rust-lang.org/std/) 或本地运行: + +```bash +cargo doc --open --package std +``` + +### 第三方库文档 +在[Crates.io](https://crates.io)找到库后,文档通常位于: +- 库的GitHub页面 +- [docs.rs](https://docs.rs)自动生成的文档 + +### 文档注释示例 +Rust支持特殊的文档注释: + +```rust +/// 计算两个数的和 +/// +/// # 示例 +/// +/// ``` +/// let result = add(2, 3); +/// assert_eq!(result, 5); +/// ``` +fn add(a: i32, b: i32) -> i32 { + a + b +} +``` + +生成文档: +```bash +cargo doc --open +``` + +## 1.6 开发环境配置建议 + +### IDE选择 +- **VS Code** + rust-analyzer扩展 +- **IntelliJ IDEA** + Rust插件 +- **CLion**(专业Rust支持) + +### 实用工具 +1. `rustfmt`:自动格式化代码 + ```bash + cargo fmt + ``` +2. `clippy`:代码质量检查 + ```bash + cargo clippy + ``` + +## 1.7 常见问题排错 + +**Q:安装后无法识别rustc命令?** +A:尝试重启终端或执行`source $HOME/.cargo/env` + +**Q:Cargo下载依赖慢?** +A:配置国内镜像源(在`~/.cargo/config`添加): +```toml +[source.crates-io] +replace-with = 'ustc' + +[source.ustc] +registry = "https://mirrors.ustc.edu.cn/crates.io-index" +``` + +**Q:Windows上编译失败?** +A:可能需要安装Visual Studio Build Tools或MinGW + +## 1.8 本章小结 + +本章完成了: +- ✅ Rust开发环境搭建 +- ✅ 第一个Rust程序创建和运行 +- ✅ Cargo基础使用 +- ✅ Rust文档资源探索 + +> "任何伟大的旅程都始于第一步。通过Hello, Rust!,你已踏入系统编程的新世界。" + +**下一章预告**:深入Rust语言核心——所有权系统与基本数据类型,掌握Rust独特的内存管理哲学。 + +--- + +> 环境信息:本书示例基于Rust 1.78稳定版编写,所有代码均通过cargo 1.78测试验证。 \ No newline at end of file diff --git a/02.md b/02.md new file mode 100644 index 0000000..dc60144 --- /dev/null +++ b/02.md @@ -0,0 +1,236 @@ +# 第二章:所有权:Rust的灵魂解码(补充版) + +## 2.3 生命周期标注详解:实践与约束 + +生命周期(Lifetime)是Rust确保引用安全的基石。它本质上是一种标注系统,用于描述引用的有效范围,防止悬垂引用。 + +### 生命周期核心概念 + +1. **生命周期参数**:以撇号开头的小写标识符(如 `'a`) +2. **作用**:描述多个引用之间的关系 +3. **目标**:确保引用始终指向有效数据 + +### 生命周期标注语法 + +```rust +// 函数签名中的生命周期标注 +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { x } else { y } +} + +// 结构体中的生命周期标注 +struct TextHolder<'a> { + text: &'a str, +} + +// impl块中的生命周期标注 +impl<'a> TextHolder<'a> { + fn get_text(&self) -> &str { + self.text + } +} +``` + +### 生命周期省略规则 + +Rust编译器在特定场景下可以自动推断生命周期: + +1. **规则1**:每个引用参数获得独立生命周期 + ```rust + fn first_word(s: &str) -> &str // 等价于 fn first_word<'a>(s: &'a str) -> &'a str + ``` + +2. **规则2**:只有一个输入生命周期时,输出生命周期与之相同 + ```rust + fn trim(s: &str) -> &str // 等价于 fn trim<'a>(s: &'a str) -> &'a str + ``` + +3. **规则3**:方法签名中,`&self`或`&mut self`的生命周期赋予所有输出生命周期 + ```rust + impl String { + fn as_str(&self) -> &str // 等价于 fn as_str<'a>(&'a self) -> &'a str + } + ``` + +### 生命周期约束 + +使用`where`子句或`:`操作符添加约束: + +```rust +// 要求 'b 至少与 'a 一样长 +fn process<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str { + if x.len() > y.len() { x } else { y } +} + +// 结构体字段的生命周期约束 +struct DoubleRef<'a, 'b: 'a> { + first: &'a str, + second: &'b str, +} +``` + +### 静态生命周期 + +`'static` 是特殊的生命周期,表示引用在整个程序运行期间有效: + +```rust +// 字符串字面量具有 'static 生命周期 +let s: &'static str = "Hello, Rust!"; + +// 返回静态生命周期的函数 +fn get_static() -> &'static str { + "This is static" +} +``` + +### 复杂生命周期示例 + +```rust +struct Context<'a> { + source: &'a str, + processed: String, +} + +impl<'a> Context<'a> { + // 多个输入生命周期,输出生命周期与self相同 + fn combine_with<'b>(&'a self, other: &'b str) -> &'a str + where + 'b: 'a + { + self.processed.push_str(other); + &self.processed + } +} + +fn main() { + let source = "Original"; + let mut ctx = Context { + source, + processed: String::new(), + }; + + let addition = " - Extended"; + let result = ctx.combine_with(addition); + + println!("Combined: {}", result); +} +``` + +## 2.7 实例:单例模式的安全实现 + +在Rust中实现线程安全的单例模式需要特殊处理,因为全局可变状态需要同步机制。以下是使用`OnceLock`的现代实现: + +```rust +use std::sync::{OnceLock, Mutex}; + +struct Singleton { + data: String, +} + +impl Singleton { + fn new() -> Self { + Singleton { + data: "Initialized".to_string(), + } + } + + fn update_data(&mut self, new_data: &str) { + self.data = new_data.to_string(); + } + + fn get_data(&self) -> &str { + &self.data + } +} + +// 全局单例实例 +static INSTANCE: OnceLock> = OnceLock::new(); + +fn get_singleton() -> &'static Mutex { + INSTANCE.get_or_init(|| Mutex::new(Singleton::new())) +} + +fn main() { + // 第一次访问初始化 + { + let mut instance = get_singleton().lock().unwrap(); + instance.update_data("First update"); + println!("Instance 1: {}", instance.get_data()); + } + + // 后续访问使用已初始化实例 + { + let instance = get_singleton().lock().unwrap(); + println!("Instance 2: {}", instance.get_data()); + } + + // 多线程环境测试 + let handle1 = std::thread::spawn(|| { + let mut instance = get_singleton().lock().unwrap(); + instance.update_data("Thread 1 update"); + println!("Thread 1: {}", instance.get_data()); + }); + + let handle2 = std::thread::spawn(|| { + // 等待足够时间确保线程1已完成 + std::thread::sleep(std::time::Duration::from_millis(50)); + let instance = get_singleton().lock().unwrap(); + println!("Thread 2: {}", instance.get_data()); + }); + + handle1.join().unwrap(); + handle2.join().unwrap(); +} +``` + +### 单例模式实现解析 + +1. **线程安全**:使用`Mutex`保证内部可变性 +2. **延迟初始化**:`OnceLock`确保只初始化一次 +3. **生命周期管理**:`'static`生命周期保证全局可用 +4. **访问控制**:通过`get_singleton()`函数控制访问 + +### 替代方案:`lazy_static`宏 + +```rust +#[macro_use] +extern crate lazy_static; + +use std::sync::Mutex; + +lazy_static! { + static ref INSTANCE: Mutex = Mutex::new(Singleton::new()); +} + +fn main() { + let mut instance = INSTANCE.lock().unwrap(); + instance.update_data("Lazy Static"); + println!("{}", instance.get_data()); +} +``` + +## 生命周期最佳实践 + +1. **优先使用编译器推断**:只在必要处显式标注 +2. **缩小生命周期范围**:避免不必要的长生命周期 +3. **结构体设计**:包含引用时总是标注生命周期 +4. **避免复杂嵌套**:简化生命周期关系 +5. **测试边界情况**:特别关注引用可能失效的场景 + +## 本章总结(增强版) + +所有权系统是Rust内存安全的基石: +- **移动语义**取代了隐式拷贝,提升效率 +- **借用检查器**在编译期防止数据竞争 +- **生命周期标注**确保引用有效性(补充了详细规则和约束) +- **String/&str**转换是日常编程关键 +- **变量/常量**设计保障程序稳定性 +- **单例模式实现**展示了全局状态的安全管理 + +通过本章的学习,你应该能够: +1. 理解Rust所有权系统的核心概念 +2. 正确使用生命周期标注解决复杂引用问题 +3. 实现线程安全的单例模式 +4. 编写安全的Rust代码避免常见内存错误 + +在后续章节中,我们将基于这些概念探索更高级的Rust特性,包括智能指针、并发编程和异步处理。 \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..0fd45f2 --- /dev/null +++ b/Readme.md @@ -0,0 +1,5 @@ +# rustbook + +书名:Rust实战精要:从入门到工程实践 + +为自己学习Rust做记录 \ No newline at end of file diff --git a/大纲.md b/大纲.md new file mode 100644 index 0000000..2975702 --- /dev/null +++ b/大纲.md @@ -0,0 +1,96 @@ +以下是为降低学习难度设计的《Rust实战精要:从入门到工程实践》书籍大纲,结合渐进式项目与工程化场景,每章配备关键提示词: + +--- + +### **第一部分:基础筑基(1-4章)** +**第1章 打破恐惧:Rust初体验** +- 提示词:`安装Rustup | cargo new hello_rust | println!("你好, {}!", "Rust") | cargo run` +- 项目:命令行问候程序(处理用户输入) + +**第2章 所有权:Rust的灵魂解码** +- 提示词:`移动语义 vs 克隆 | 借用检查器错误分析 | 生命周期标注实践 | String与&str转换场景` +- 实例:实现安全字符串处理器(避免悬垂指针) + +**第3章 类型系统实战** +- 提示词:`模式匹配解构Option | Result错误传播?操作符 | 泛型结构体实现 | trait约束实战` +- 项目:文件读取工具(强错误处理链) + +**第4章 结构化工程:模块与包** +- 提示词:`mod层级设计 | pub权限控制 | workspace多crate管理 | 文档测试//!` +- 实例:构建图书馆管理系统模块 + +--- + +### **第二部分:中级突破(5-8章)** +**第5章 并发安全:无畏并行** +- 提示词:`Arc共享状态 | 通道消息传递 | Send/Sync trait剖析 | Rayon并行迭代` +- 项目:高并发Web访问计数器 + +**第6章 异步编程实战** +- 提示词:`async/await语法树 | tokio运行时配置 | Future组合器 | select!宏竞态处理` +- 项目:异步API聚合爬虫(reqwest + tokio) + +**第7章 元编程:宏与属性** +- 提示词:`声明宏编写规则 | derive过程宏生成 | 属性宏应用 | 编译期反射技巧` +- 实例:自定义序列化宏(替代serde) + +--- + +### **第三部分:工程化实战(9-12章)** +**第8章 项目架构:大型工程范式** +- 提示词:`领域驱动设计(DDD) | 分层架构 | config模式 | 错误统一处理anyhow` +- 项目:电商订单系统骨架 + +**第9章 性能调优大师课** +- 提示词:`criterion基准测试 | perf火焰图分析 | Copy/Clone成本对比 | 零成本抽象验证` +- 实例:高性能JSON解析器优化(simd-json) + +**第10章 FFI与系统编程** +- 提示词:`bindgen绑定C库 | unsafe边界控制 | no_std环境搭建 | WASM编译目标` +- 项目:构建Linux系统监控工具 + +--- + +### **第四部分:工业级项目(13-16章)** +**第13章 网络服务:构建异步网关** +- 技术栈:`axum + tokio + sqlx + tracing` +- 提示词:`中间件管道 | JWT鉴权集成 | 连接池配置 | OpenTelemetry追踪` +- 项目:微服务网关(负载均衡/熔断) + +**第14章 CLI工具开发** +- 提示词:`clap参数解析 | 终端颜色控制 | 进度条实现 | 子命令嵌套` +- 项目:跨平台文件同步工具 + +**第15章 WebAssembly前端应用** +- 提示词:`wasm-bindgen交互 | web-sys DOM操作 | Yew组件开发 | wasm-pack构建` +- 项目:浏览器图像处理器 + +--- + +### **附录精要** +- 提示词库:所有权可视化口诀/编译器错误速查 +- 工程检查表:Clippy规则集/Cargo.toml优化清单 +- 生存指南:unsafe安全边界/递归类型破解 + +--- + +### **教学特色设计** +1. **认知减负策略** + - 所有权:用「租房合同」比喻(租借期间房东不可修改房屋) + - 生命周期:可视化数据流图标注 + - 错误处理:分层错误金字塔设计(From特征自动升级) + +2. **渐进式项目链** + ```mermaid + graph LR + A[命令行计算器] --> B[多线程日志分析器] + B --> C[异步HTTP代理] + C --> D[分布式键值存储] + ``` + +3. **工程化实景** + - CI/CD流水线配置(GitHub Actions) + - 容器化部署指南(Docker多阶段构建) + - 性能监控(Prometheus+Grafana) + +本书通过**编译器驱动开发(CDD)** 模式,每章以典型错误为起点,引导读者在修复中理解设计哲学,配合24个可运行示例项目,大幅降低学习曲线。 \ No newline at end of file