附录 Rust 速查表:写给不熟 Rust 的读者¶
本书的解剖标本 Codex 是用 Rust 写的,但——你不需要会 Rust。
读本书里的代码,只做两件事:看结构、读注释。代码都经过裁剪、配了中文注释,哪怕整段跳过、只读正文,也不影响你理解 harness 的设计。
这张速查表,把书里会碰到的 Rust 记号,用 Python / JS 类比一句话说清。卡住时翻回来对一眼即可,不必记。
读码三原则(来自第 2 章)
只看三样:数据结构(定义了哪些 struct/enum)、控制流(关键函数何时被谁调用)、边界(在哪拦截/校验/转换)。Rust 的生命周期、宏、async 细节,一律先跳过——它们几乎不影响你理解 harness 的设计。
一、基础记号¶
| Rust | 意思 | 类比 |
|---|---|---|
let x = … |
定义变量(默认不可变) | Python x = … |
let mut x = … |
定义可变变量 | Python x = …(Rust 要显式 mut) |
fn name(...) -> T |
定义函数,返回类型 T |
Python def name(...) -> T |
pub / pub(crate) |
对外公开 / 仅本 crate 内可见 | 可见性;Python 靠 _ 下划线约定 |
// … |
行注释 | Python # … |
:: |
路径分隔(模块::项、枚举::变体) |
Python 的 .(os.path ≈ os::path) |
loop { … } |
无限循环 | Python while True: |
Vec<T> |
动态数组 | Python list |
String / &str |
字符串 | Python str |
二、类型与接口¶
| Rust | 意思 | 类比 |
|---|---|---|
struct S { a, b } |
只有字段的数据类型 | Python @dataclass |
enum E { A, B(x) } |
"几选一"类型,每个分支还能带数据 | 升级版 Enum / 标签联合(tagged union) |
trait T { … } |
接口:规定"要实现哪些方法" | Python Protocol / 抽象基类 |
impl T for S |
给类型 S 实现接口 T |
在类里写它的方法 |
<T> / <T: Trait> |
泛型 / 带约束的泛型 | Python TypeVar / 泛型 |
self / &self |
方法里的当前对象(& 是"借用") |
Python self |
第 3 章那个
trait SessionTask { fn run(...); … },就是"规定每种任务都得有个run方法"——和 Python 里写一个Protocol是一回事。
三、结果与空值(最容易卡的就是这组)¶
| Rust | 意思 | 类比 |
|---|---|---|
Result<T, E> |
要么成功(带值 T),要么失败(带错误 E) |
Python:把"返回值"和"抛异常"合成了一个返回类型 |
Ok(v) / Err(e) |
成功值 / 失败值 | — |
match x { Ok(v) => …, Err(e) => … } |
分情况处理 | Python match/case,或一串 if/elif |
f()? |
调用 f(),出错就把错误提前 return 出去 |
Python:异常自动往上抛 |
Option<T> / Some(v) / None |
可能有值、可能没有 | Python:一个值 or None |
所以第 3 章
run_turn里match run_sampling_request(…) { Ok(out) => …, Err(CodexErr::TurnAborted) => break, … },大白话就是:"调一次模型——成功就处理结果,被中断就跳出循环,其它错误就收尾。"
四、异步与并发(读时基本可跳过)¶
| Rust | 意思 | 类比 |
|---|---|---|
async fn / .await |
异步函数 / 等它完成 | 和 Python async def / await 几乎一样 |
tokio |
异步运行时 | Python 的 asyncio |
foo!(…)(带 !) |
宏(编译期展开),如 select!、info_span! |
当成"函数式语法糖",看名字猜意图即可 |
& / &mut |
借用 / 可变借用 | Python 全是引用——读代码时忽略 & 即可 |
Send + Sync + 'static |
并发安全 / 生命周期标记 | 直接跳过,不影响理解逻辑 |
关于 pi 的 TypeScript¶
第 3 章里 pi 的循环是 TypeScript(不是 Rust)。但它的记号和 Python 也几乎一对一:while、if、const、await、array.filter(...)、a ?? b(≈ Python a if a is not None else b)、obj?.method()(≈ "obj 不为空才调")。同样——看结构、读注释就够。
一句话收尾:读到代码先当伪代码看,跟着注释走;只有当你想确认某个细节时,再翻回这张表对一眼。真正重要的从来不是 Rust 语法,而是它在解决哪个真实的失败。