添加Rust学习笔记前两章内容:Rust初体验和所有权系统详解
This commit is contained in:
commit
3dc26f670c
|
|
@ -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测试验证。
|
||||
|
|
@ -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<Mutex<Singleton>> = OnceLock::new();
|
||||
|
||||
fn get_singleton() -> &'static Mutex<Singleton> {
|
||||
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<Singleton> = 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特性,包括智能指针、并发编程和异步处理。
|
||||
|
|
@ -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<Mutex>共享状态 | 通道消息传递 | 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个可运行示例项目,大幅降低学习曲线。
|
||||
Loading…
Reference in New Issue