Files
rust/std/readme.md
2025-10-05 23:51:24 +08:00

305 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

当然可以 👍
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` 函数速查表」**,方便查阅。
你想要哪种?