跳转至

附录 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.pathos::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_turnmatch 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 也几乎一对一:whileifconstawaitarray.filter(...)a ?? b(≈ Python a if a is not None else b)、obj?.method()(≈ "obj 不为空才调")。同样——看结构、读注释就够。


一句话收尾:读到代码先当伪代码看,跟着注释走;只有当你想确认某个细节时,再翻回这张表对一眼。真正重要的从来不是 Rust 语法,而是它在解决哪个真实的失败

留言