This commit is contained in:
e2hang
2025-10-05 23:51:24 +08:00
parent 1f9543c16c
commit 23f17bfc2c
113 changed files with 1236 additions and 0 deletions

304
std/readme.md Normal file
View File

@@ -0,0 +1,304 @@
当然可以 👍
Rust 的 **`std`标准库standard library** 是整个语言生态的核心组成部分,它提供了 **语言运行时支持、内存管理、集合、I/O、并发、系统接口、错误处理、数值计算** 等几乎所有基础功能。
我可以帮你系统地、分层地介绍一遍「`std` 的全貌 + 每个模块的主要功能 + 常用类型和技巧」。
---
## 🧱 一、`std` 总体结构
Rust 标准库的顶层结构大体可以分为以下几层:
| 层级 | 模块 | 说明 |
| ----------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| **基础层** | `std::marker`, `std::mem`, `std::ptr`, `std::cell`, `std::rc`, `std::sync` | 管理内存、引用、生命周期、并发引用计数等底层特性 |
| **语言支持层** | `std::ops`, `std::convert`, `std::cmp`, `std::clone`, `std::fmt`, `std::default`, `std::hash` | 实现语言语义所需的 trait加减乘除、比较、拷贝、格式化、哈希等 |
| **基础类型层** | `std::option`, `std::result`, `std::string`, `std::vec`, `std::boxed`, `std::collections` | 基本容器和控制结构 |
| **系统接口层** | `std::fs`, `std::io`, `std::env`, `std::process`, `std::path`, `std::time`, `std::net` | 系统 I/O、文件系统、环境变量、网络、进程、时间等 |
| **并发层** | `std::thread`, `std::sync`, `std::sync::mpsc`, `std::sync::atomic` | 多线程、通道通信、同步原语 |
| **错误与调试层** | `std::error`, `std::panic`, `std::backtrace`, `std::dbg!` | 错误处理、panic 栈回溯、调试工具 |
| **预导入层prelude** | `std::prelude::v1` | 默认导入到每个作用域的常用类型,如 `Option`, `Result`, `Vec`, `Box`, `String`, `Clone`, `Drop` 等 |
| **运行时支持层** | `std::process`, `std::alloc`, `std::thread::panicking` | 运行时内存分配、程序退出、panic 处理 |
---
## 🧩 二、核心模块详解
### 1. `std::prelude`
Rust 每个文件默认导入:
```rust
use std::prelude::v1::*;
```
包含:
* 基本类型别名:`Box`, `Vec`, `String`
* 常用 traits`Clone`, `Copy`, `Drop`, `PartialEq`, `PartialOrd`, `Iterator`, `From`, `Into`, `Default`
* 基本枚举:`Option`, `Result`
---
### 2. `std::io` —— 输入输出系统
主要结构:
* **Traits**
* `Read``Write`:流式读写
* `BufRead`:带缓冲的读取
* `Seek`:文件定位
* **常用类型**
* `stdin()`, `stdout()`, `stderr()`
* `Cursor`:让字节缓冲区当作文件使用
* **示例**
```rust
use std::io::{self, Write};
fn main() {
print!("请输入名字:");
io::stdout().flush().unwrap();
let mut name = String::new();
io::stdin().read_line(&mut name).unwrap();
println!("你好,{}!", name.trim());
}
```
---
### 3. `std::fs` —— 文件系统
* `File`:文件读写
* `read_to_string()`:快速读取文件
* `write()`:写文件
* `metadata()`:文件信息
* `create_dir_all()`:创建多层目录
* **示例**
```rust
use std::fs;
fn main() {
fs::write("hello.txt", "Hello, world!").unwrap();
let s = fs::read_to_string("hello.txt").unwrap();
println!("{}", s);
}
```
---
### 4. `std::env`
* 环境变量:`env::var("PATH")`
* 命令行参数:`env::args()`
* 当前路径:`env::current_dir()`
* **示例**
```rust
use std::env;
fn main() {
for arg in env::args() {
println!("参数: {arg}");
}
}
```
---
### 5. `std::thread` + `std::sync` —— 并发
* **`thread::spawn`**:创建线程
* **`join`**:等待线程结束
* **`Mutex` / `RwLock`**:锁机制
* **`Arc<T>`**:原子引用计数
* **`mpsc`**:多生产者单消费者通道
* **示例**
```rust
use std::thread;
use std::sync::{Arc, Mutex};
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for h in handles {
h.join().unwrap();
}
println!("结果: {}", *counter.lock().unwrap());
}
```
---
### 6. `std::collections` —— 集合容器
主要类型:
* `VecDeque`(双端队列)
* `LinkedList`
* `HashMap`, `HashSet`
* `BTreeMap`, `BTreeSet`(有序)
* **常用方法:**
* `insert`, `get`, `remove`, `entry`
```rust
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 90);
scores.insert("Bob", 85);
println!("{:?}", scores.get("Alice"));
}
```
---
### 7. `std::option` & `std::result`
* **`Option<T>`**: 可能有值,也可能没有
* **`Result<T, E>`**: 成功/失败的封装
* 关键方法:
* `.unwrap()`, `.unwrap_or()`, `.map()`, `.and_then()`
* `.ok()`, `.err()`, `.expect()`
```rust
fn div(a: f64, b: f64) -> Result<f64, &'static str> {
if b == 0.0 { Err("除数不能为0") }
else { Ok(a / b) }
}
```
---
### 8. `std::path` & `std::process` & `std::time`
* `Path`, `PathBuf`:路径处理
* `Command`:运行外部命令
* `Instant`, `Duration`, `SystemTime`:时间测量
```rust
use std::process::Command;
fn main() {
let out = Command::new("echo").arg("Hello").output().unwrap();
println!("{}", String::from_utf8_lossy(&out.stdout));
}
```
---
### 9. `std::sync::atomic`
* 原子操作(无锁)
* `AtomicBool`, `AtomicI32`, `AtomicUsize` 等
* 操作:`load()`, `store()`, `fetch_add()`, `compare_exchange()`
```rust
use std::sync::atomic::{AtomicUsize, Ordering};
static COUNTER: AtomicUsize = AtomicUsize::new(0);
fn main() {
COUNTER.fetch_add(1, Ordering::SeqCst);
}
```
---
### 10. `std::net`
* `TcpStream`, `TcpListener`
* `UdpSocket`
* `ToSocketAddrs`
```rust
use std::net::TcpListener;
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080")?;
for stream in listener.incoming() {
println!("连接: {:?}", stream?);
}
Ok(())
}
```
---
### 11. `std::error`, `std::panic`, `std::backtrace`
* `Error` trait所有错误类型实现
* `panic!()`:触发不可恢复错误
* `catch_unwind()`:捕获 panic
* `backtrace::Backtrace`:调试栈信息
---
### 12. `std::mem` & `std::ptr` —— 底层内存操作
* `mem::swap`, `mem::take`, `mem::replace`
* `ptr::null`, `ptr::copy`, `ptr::write`
* 这些是「unsafe」核心模块支撑 `Vec`, `Box` 等容器的实现。
---
## 🧮 三、一些常用顶层类型
| 类型 | 用途 |
| ---------------------------------- | ------------- |
| `String` / `&str` | UTF-8 字符串 |
| `Vec<T>` | 动态数组 |
| `Box<T>` | 堆分配的对象 |
| `Rc<T>` / `Arc<T>` | 引用计数(单线程/多线程) |
| `Mutex<T>` / `RwLock<T>` | 同步锁 |
| `HashMap<K, V>` / `BTreeMap<K, V>` | 字典映射 |
| `Option<T>` / `Result<T, E>` | 控制流程 |
| `thread::JoinHandle<T>` | 线程句柄 |
| `Duration` / `Instant` | 时间度量 |
---
## 🧭 四、`std` 与 `core` / `alloc` 的关系
Rust 标准库其实分三层:
1. **`core`**:最基础层(无堆内存、无操作系统),适用于 `no_std` 环境。
2. **`alloc`**:提供堆分配支持,如 `Box`, `Vec`, `String`。
3. **`std`**:在前两者之上 + 操作系统 API + I/O + 并发。
结构如下:
```
core ──→ alloc ──→ std
```
---
## 📚 五、如何学习和查找
👉 命令行文档查看:
```bash
rustup doc --std
```
👉 在线官方文档(推荐):
🔗 [https://doc.rust-lang.org/std/](https://doc.rust-lang.org/std/)
---
如果你愿意,我可以帮你生成一份 **「`std` 模块思维导图(层级树)」** 或者 **「最常用 50 个 `std` 函数速查表」**,方便查阅。
你想要哪种?