附录 A · 术语中英对照
本附录是全篇译法基准:任何章节出现的术语,都必须与本表一致。 若某章想采用不同译名,先改本表,再改所有引用它的章节,不允许两套译法并存。 报错相关术语见附录 B · 编译器报错速查。
使用说明
本附录不是「词汇表装饰」,而是约束文件。它的作用有三条:
- 可检索:读者看到
monomorphization不懂,能在本表查到「单态化」,再用同一关键词在本站内搜索。 - 可预测:
borrow永远是「借用」,elision永远是「省略」,读者第二次见到不必重新猜。 - 可对照:读者已有 Python / Java / C++ / Go 经验,本表的「一句话说明」直接写清这个概念** 在哪门语言里对应什么**,省去来回查英文文档。
阅读约定:
- 表格里的「首次出现章节」是该术语第一次被正式定义的位置,不是唯一出现的位置。
- 英文列一律用反引号包裹(
ownership),保证等宽字体下形近字母(l/1、O/0)可辨。 - 代码标识符(
Vec<T>、unwrap_or_else、dyn)不翻译、不加空格,直接照抄。 - 译名栏里带「(不译)」的条目,正文中必须保留英文原词,禁止自造中文名。
A.1 主表:术语中英对照
| 英文 | 中文译名 | 一句话说明 | 首次出现章节 |
|---|---|---|---|
| ownership | 所有权 | 「谁持有值、谁负责释放」的编译期规则,替代 GC 与手动 free | 所有权 |
| borrowing | 借用 | 以引用临时访问别人的值,不取得所有权;用 &/&mut 表达 | 所有权 |
| move semantics | 移动语义 | 赋值/传参把所有权交给新位置,原变量随之失效,防止双重释放 | 所有权 |
| copy semantics | 复制语义 | 赋值/传参按位复制出独立的值,原变量仍可用(Copy 类型) | 所有权 |
| clone | 克隆 | 显式调用 .clone() 做一次可能昂贵的深拷贝,与移动到新位置无关 | 所有权 |
| lifetime | 生命周期 | 编译期的「引用有效期」标注,描述引用之间的关系而非运行期时长 | 所有权 |
| elision | 省略(生命周期省略) | 编译器按固定三条规则补出未写的生命周期,'_ 表示此处省略 | 泛型与生命周期 |
| variance | 型变 | 泛型参数上的生命周期/类型能否子类型化的方向性规则 | 泛型与生命周期 |
| covariance | 协变 | &'long T 可用在需要 &'short T 的地方(生命周期可缩短) | 泛型与生命周期 |
| contravariance | 逆变 | 方向与协变相反,主要出现在函数参数位置:fn(&'short T) 可用于 fn(&'long T) | 泛型与生命周期 |
| invariance | 不变(不变型) | 既不能放宽也不能收紧,&mut T、Cell<T>、UnsafeCell<T> 都是不变 | 泛型与生命周期 |
| drop | 析构(不译 drop) | 值离开作用域时自动调用的清理钩子,Drop::drop 只应由编译器调用 | 所有权 |
| RAII | RAII(不译) | 资源获取即初始化:把释放逻辑绑在值的生存期上,Rust 用 Drop 实现 | 所有权 |
| stack | 栈 | 编译期已知大小的后进先出区域,分配只是移动栈指针 | 所有权 |
| heap | 堆 | 运行期按需申请的内存区域,靠指针访问,需要所有者负责归还 | 所有权 |
| pointer | 指针 | 一个内存地址值;Rust 里分引用(有借用检查)与裸指针(无检查)两类 | 所有权 |
| reference | 引用 | 借来的地址,&T 只读、&mut T 独占可写,受借用检查器约束 | 所有权 |
| dereference | 解引用 | 用 *(或自动解引用)从引用拿到被引用的值 | 所有权 |
| smart pointer | 智能指针 | 带所有权语义与 Deref/Drop 行为的指针类型,如 Box/Rc/Arc | 智能指针与闭包 |
| interior mutability | 内部可变性 | 通过 &T 也能修改内部状态,把借用检查从编译期挪到运行期 | 智能指针与闭包 |
| trait | trait(不译) | 一份能力契约,类似 Java 接口但可带默认实现、可给外部类型实现 | 结构体与 trait |
| trait object | trait 对象 | dyn Trait 形式,运行期决定调用哪个实现,是数据指针 + 虚表的胖指针 | 结构体与 trait |
| blanket impl | 泛型实现 / 全覆盖实现 | impl<T: Bound> Trait for T 一类实现,给满足约束的所有类型统一加能力 | 泛型与生命周期 |
| orphan rule | 孤儿规则 | 只有当 trait 或类型至少有一个属于本 crate 时才能写 impl | 结构体与 trait |
| coherence | 一致性 | 借用检查之外的「实现唯一性」规则,禁止两个 crate 写出冲突实现 | 结构体与 trait |
| object safety | 对象安全 / dyn 兼容 | trait 能否写成 dyn Trait:方法不能带泛型参数、不能返回 Self 等 | 泛型与生命周期 |
| associated type | 关联类型 | trait 里用 type Item; 声明的「由实现者填」的类型槽位 | 泛型与生命周期 |
| generic | 泛型 | 用类型参数写一份代码、适配多种类型;单态化后等价于手写多份 | 泛型与生命周期 |
| monomorphization | 单态化 | 编译期为每组实参生成一份专用代码,是静态分发的实现方式 | 泛型与生命周期 |
| type erasure | 类型擦除 | 抹掉具体类型只保留接口;Rust 里对应 dyn Trait,Java 泛型是另一种擦除 | 泛型与生命周期 |
| tuple struct | 元组结构体 | struct Point(i32, i32); 字段无名字、按序号访问 .0/.1 | 结构体与 trait |
| unit struct | 单元结构体 | struct Marker; 不携带数据的类型,常用于实现 trait 做标记 | 结构体与 trait |
| enum variant | 枚举变体 | enum 的一个可能取值分支,可各自携带不同数据 | 结构体与 trait |
| pattern matching | 模式匹配 | 用 match/if let/let 把值拆开,编译器检查是否覆盖所有情况 | 变量与流程控制 |
| exhaustiveness | 穷尽性检查 | 编译器要求 match 覆盖所有可能取值,缺一个就报编译错误 | 变量与流程控制 |
| binding | 绑定(模式绑定) | 在模式中用名字把匹配到的部分接出来,如 Some(x) 里的 x | 变量与流程控制 |
| guard | 守卫(match guard) | arm if cond => 形式的附加条件,条件不成立则继续试下一个分支 | 变量与流程控制 |
| slice | 切片 | 一段连续内存的视图,&[T] 携带地址与长度,不拥有数据 | 所有权 |
| array | 数组 | [T; N],长度是类型的一部分,编译期已知,通常分配在栈上 | 变量与流程控制 |
| vector | 动态数组(不译 Vec) | Vec<T>:堆上的可变长连续序列,拥有元素并负责释放 | 集合与迭代器 |
| hash map | 哈希表(不译 HashMap) | HashMap<K, V>:平均 O(1) 查找,键无序,迭代顺序不保证 | 集合与迭代器 |
| b-tree map | B 树映射(不译 BTreeMap) | BTreeMap<K, V>:按键有序,支持范围查询,迭代顺序确定 | 集合与迭代器 |
| iterator | 迭代器 | 实现 Iterator 的对象,核心只有一个 next() 方法 | 集合与迭代器 |
| adapter | 适配器 | 消费一个迭代器并返回新迭代器的方法,如 map/filter/take | 集合与迭代器 |
| consumer | 消费者 | 真正驱动迭代、返回非迭代器结果的方法,如 collect/sum/fold | 集合与迭代器 |
| lazy evaluation | 惰性求值 | 适配器不做事,只有消费者调用 next() 时才逐个计算 | 集合与迭代器 |
| closure | 闭包 | 能捕获环境的匿名函数,编译器为每个闭包生成唯一匿名类型 | 智能指针与闭包 |
| capture | 捕获 | 闭包按需借用或夺取外层变量;move 强制按值夺取 | 智能指针与闭包 |
| higher-ranked trait bound | 高阶 trait 约束(HRTB) | for<'a> Fn(&'a T):约束「对任意生命周期都成立」,常见于函数参数 | 智能指针与闭包 |
| trait bound | trait 约束 | 对泛型参数的能力要求,写在 T: Trait 或 where 中 | 泛型与生命周期 |
| where clause | where 子句 | 把复杂的 trait 约束挪到签名之后,等价于尖括号里的写法 | 泛型与生命周期 |
| impl Trait | impl Trait(不译) | 参数位置的匿名泛型(静态分发);返回位置则是「某一种具体类型」 | 泛型与生命周期 |
| dyn | dyn(不译) | dyn Trait 的关键字,明确表示这是运行期分发的 trait 对象 | 结构体与 trait |
| vtable | 虚表 | 一组函数指针,dyn Trait 靠数据指针 + 虚表指针完成动态调用 | 结构体与 trait |
| static dispatch | 静态分发 | 编译期就确定调用哪个函数,可内联、无运行期查找开销 | 结构体与 trait |
| dynamic dispatch | 动态分发 | 运行期查虚表决定调用哪个函数,无法内联,换来类型统一 | 结构体与 trait |
| zero-cost abstraction | 零开销抽象 | 不用就不付代价,用了也不比手写更差;指运行期成本而非编译期 | 所有权 |
| undefined behavior | 未定义行为 | 编译器不再保证任何结果的行为,必须靠 unsafe 契约避免 | 测试与性能 |
| unsafe | unsafe(不译) | 显式声明「此处由我负责满足安全前提」,是承诺而非关闭检查 | 测试与性能 |
| raw pointer | 裸指针 | *const T/*mut T,可空、可悬垂、不受借用检查,解引用需 unsafe | 测试与性能 |
| FFI | FFI(不译) | 外部函数接口:与其他语言(多为 C)互相调用函数、共享内存布局 | 测试与性能 |
| macro | 宏 | 编译期展开的代码生成器;与函数不同,它接受任意语法、按语法结构分发 | 宏 |
| declarative macro | 声明宏 | 用 macro_rules! 写、按模式匹配展开的宏 | 宏 |
| procedural macro | 过程宏 | 接收 token 流并生成新 token 流的 Rust 函数,分 derive/属性/函数式三种 | 宏 |
| hygiene | 卫生性 | 宏展开后引入的名字不会意外污染或捕获调用处的名字 | 宏 |
| fragment specifier | 片段说明符 | 宏模式里的 $x:expr、$t:ty 等,规定这一段要匹配什么语法 | 宏 |
| attribute | 属性 | #[...] 形式附加在条目上的元数据,可被编译器或宏读取 | 结构体与 trait |
| derive | derive(不译) | #[derive(Clone, Debug)] 一键生成常见 trait 实现的过程宏 | 结构体与 trait |
| cfg | 条件编译(不译 cfg) | #[cfg(...)] 按目标平台/特性决定代码是否参与编译 | 环境搭建与工具链 |
| feature flag | 特性开关 | Cargo 里的可选编译开关,下游用 features = ["..."] 打开 | 工程化与常用 crate |
| crate | crate(不译) | 一次编译的基本单位,对应一个库或一个可执行程序 | 环境搭建与工具链 |
| module | 模块 | 用 mod 组织的命名空间,控制可见性与路径结构 | 工程化与常用 crate |
| path | 路径 | 定位条目的写法:crate::a::b、super::x、self::y、std::vec::Vec | 工程化与常用 crate |
| prelude | 预导入(不译 prelude) | 自动进入作用域的常用名字集合,2024 edition 与旧版不同 | 变量与流程控制 |
| workspace | 工作区 | 一个 Cargo.toml 下管理多个 crate,共享锁文件与构建缓存 | 工程化与常用 crate |
| binary | 二进制(可执行程序) | src/main.rs 产出的可执行目标,不能作为依赖被别的 crate use | 工程化与常用 crate |
| library | 库 | src/lib.rs 产出的 crate,可被集成测试与下游项目依赖 | 工程化与常用 crate |
| dependency | 依赖 | [dependencies] 里声明、由 crates.io 或本地路径提供的第三方 crate | 环境搭建与工具链 |
| semantic versioning | 语义化版本 | MAJOR.MINOR.PATCH:0.x 的次版本升级也可能破坏兼容 | 工程化与常用 crate |
| lockfile | 锁文件 | Cargo.lock 记录实际使用的精确版本,保证可重现构建 | 环境搭建与工具链 |
| MSRV | 最低支持 Rust 版本 | 声明这个 crate 能被哪个最低版本的编译器编译,常写在 rust-version | 工程化与常用 crate |
| lint | lint(不译) | 编译器内置的代码检查项,可按 allow/warn/deny/forbid 分级 | 工程化与常用 crate |
| rustfmt | rustfmt(不译) | 官方格式化工具,cargo fmt 调用,把风格争论交给它 | 环境搭建与工具链 |
| clippy | clippy(不译) | 官方静态检查工具,cargo clippy 调用,给出惯用法建议 | 环境搭建与工具链 |
| doctest | 文档测试 | 把文档注释里的代码块当测试跑,保证示例不会过期 | 测试与性能 |
| unit test | 单元测试 | 与被测代码同文件、放在 #[cfg(test)] mod tests 里的私有测试 | 测试与性能 |
| integration test | 集成测试 | 放在 tests/ 目录、只使用 crate 公开 API 的测试 | 测试与性能 |
| benchmark test | 基准测试 | 测量代码耗时/吞吐,稳定 Rust 上常用 criterion 一类 crate | 测试与性能 |
| fuzzing | 模糊测试 | 用随机/变异输入狂轰入口,找 panic 与未定义行为 | 测试与性能 |
| miri | miri(不译) | 官方 MIR 解释器,能检测未定义行为,需 nightly 组件 | 测试与性能 |
| thread | 线程 | 操作系统调度的执行流,std::thread::spawn 创建,栈大小可配置 | 并发编程 |
| concurrency | 并发 | 多个任务在时间上交错推进(不一定同时执行) | 并发编程 |
| parallelism | 并行 | 多个任务在同一时刻真正同时执行,是多核加速的前提 | 并发编程 |
| data race | 数据竞争 | 至少一个写、无同步的并发访问同一内存;Rust 在安全代码里直接禁止 | 并发编程 |
| race condition | 竞态条件 | 结果依赖执行时序的逻辑 bug;数据竞争只是它的一种,编译期查不出来 | 并发编程 |
| deadlock | 死锁 | 互相等待对方持有的锁,程序永久卡住;Rust 不替你检查 | 并发编程 |
| mutex | 互斥锁(不译 Mutex) | 同一时刻只允许一个持有者访问数据,锁与数据绑定在一起 | 并发编程 |
| rwlock | 读写锁(不译 RwLock) | 允许多个读者或一个写者并发,读多写少时更划算 | 并发编程 |
| atomic | 原子类型 | AtomicUsize 一类不发生数据竞争的整数/指针类型,需指定内存顺序 | 并发编程 |
| memory ordering | 内存顺序 | 原子操作之间的可见性/重排约束,如 Relaxed/Acquire/Release/SeqCst | 并发编程 |
| channel | 通道 | 线程间单向传值的队列,std::sync::mpsc 是最小可用版本 | 并发编程 |
| message passing | 消息传递 | 通过通信共享内存:把数据 move 进通道,而不是共享可变状态 | 并发编程 |
| Send | Send(不译) | 标记 trait:该类型的值可以安全地移动到另一个线程 | 并发编程 |
| Sync | Sync(不译) | 标记 trait:&T 可以安全地在多个线程间共享 | 并发编程 |
| async | async(不译) | 把函数/代码块变成状态机,调用只得到 Future 而不立即执行 | 异步编程 |
| await | await(不译) | 在 async 上下文里挂起当前任务、等待 Future 就绪的语法 | 异步编程 |
| future | future(不译) | 表示「将来会产出一个值」的类型,核心是 poll 方法 | 异步编程 |
| poll | 轮询(不译 poll) | 执行器询问 future 是否就绪;返回 Pending 时必须注册唤醒器 | 异步编程 |
| executor | 执行器 | 反复 poll 任务并在就绪时推进它们的调度组件 | 异步编程 |
| runtime | 运行时(不译 runtime) | 执行器 + 反应器 + 定时器等的打包,如 tokio | 异步编程 |
| task | 任务 | 交给执行器调度的独立 future;与线程是多对多关系,可跨线程迁移 | 异步编程 |
| pin | 固定(不译 Pin) | 承诺「值被固定后不再移动」,自引用 future 的正确性依赖它 | 异步编程 |
| cancellation safety | 取消安全性 | 在任意 .await 点被 drop 后,逻辑仍保持一致、不丢数据 | 异步编程 |
| backpressure | 背压 | 消费者跟不上时让生产者减速或排队受限,避免内存无限增长 | 异步编程 |
| serde | serde(不译) | 序列化框架:类型只实现 Serialize/Deserialize,格式由后端决定 | 工程化与常用 crate |
| token stream | 词法单元流 | 过程宏的输入输出形式,TokenStream 是比字符串更精确的代码表示 | 宏 |
| span | 源码区间(不译 span) | token 记录的位置信息,过程宏靠它报出指向正确位置的错误 | 宏 |
A.2 易混词对比(每条都有「怎么选」结论)
💡 对照:这几组词是初学者搜索量最高的「到底用哪个」问题。 结论列可以直接当决策规则背下来,不必每次都重新推理。
A.2.1 &T vs &mut T
| 维度 | &T | &mut T |
|---|---|---|
| 同时存在的个数 | 任意多个 | 同一时刻只能一个 |
| 能否读 | 能 | 能 |
| 能否改 | 不能 | 能 |
| 与对方共存 | 有 &T 时不能有 &mut T | 有 &mut T 时不能有任何 &T |
| 其他语言里的近似物 | Java 的 final 引用(但不保证对象不变) | C 的指针(但没有别名检查) |
| 怎么选 | 默认先用 &T;只有确实要写入时才升级为 &mut T | 需要修改、或需要移动出内部字段时用 |
⚠️ 陷阱:
&T只保证你不能通过它改,不保证别人不改。 若类型内部有Cell/RefCell/Mutex,&T也能改内部状态(见 A.2.5)。
A.2.2 String vs &str vs str
| 维度 | str | &str | String |
|---|---|---|---|
| 大小 | 不定长(!Sized) | 胖指针(地址 + 长度) | 三字段(ptr/len/capacity) |
| 存放位置 | 只在别处、被引用 | 可能指向 String 或字符串字面量 | 堆上自有的 UTF-8 缓冲 |
| 拥有数据 | 否 | 否 | 是 |
| 能否增长 | 否 | 否 | 能(push_str、push) |
| 能否单独作变量类型 | 不能,必须 Box<str> 或 &str | 能 | 能 |
| 怎么选 | 函数参数一律写 &str | 只读的字符串视图 | 需要拥有、需要修改时用 |
🧠 原理:写
fn f(s: &str)后,&String会经解引用强制转换(deref coercion) 自动变成&str,所以调用方既能传&String也能传字面量;写&String则两头都难受。
A.2.3 Vec<T> vs [T; N] vs &[T]
| 维度 | [T; N] | Vec<T> | &[T] |
|---|---|---|---|
| 长度 | 类型的一部分,编译期固定 | 运行期可变 | 运行期已知,但不可变 |
| 存放位置 | 通常在栈(或结构体内部) | 数据在堆上 | 借用别处的连续内存 |
| 能否增长 | 不能 | 能 | 不能 |
| 拥有数据 | 是 | 是 | 否 |
| 其他语言对应 | C 的数组、Go 的数组 | Java 的 ArrayList、Python 的 list | Go 的 slice(只读版) |
| 怎么选 | 长度固定且不大时用 | 需要拥有/增删元素时用 | 函数参数一律写 &[T] |
A.2.4 Rc<T> vs Arc<T>
| 维度 | Rc<T> | Arc<T> |
|---|---|---|
| 计数方式 | 普通整数增减 | 原子操作 |
| 线程安全 | 否,不实现 Send/Sync | 是(当 T: Send + Sync) |
| 性能 | 更快 | 每次克隆多一次原子操作开销 |
| 能否跨线程 | 不能,编译器直接拦下 | 能 |
| 怎么选 | 单线程共享所有权用 Rc | 只要可能跨线程就用 Arc,别为省一点开销留隐患 |
⚠️ 陷阱:
Rc和Arc都不允许通过它们修改内部值(没有&mut)。 要「共享 + 可改」得配RefCell(单线程)或Mutex/RwLock(多线程)。
A.2.5 Cell<T> vs RefCell<T>
| 维度 | Cell<T> | RefCell<T> |
|---|---|---|
| 取值方式 | get()(要求 T: Copy)或 replace/take | borrow() / borrow_mut() |
| 借用检查时机 | 无借用,直接复制/替换 | 运行期计数,违反规则时 panic |
| 能否拿到内部引用 | 不能(除非自己用 UnsafeCell 实现) | 能,borrow_mut() 给出 RefMut<T> |
| 可否跨线程 | 否 | 否 |
| 怎么选 | 值小、是 Copy、只需整体替换/计数时用 Cell | 需要可变引用、需要读后修改时用 RefCell |
🧠 原理:
RefCell的 panic 是运行期的,编译器帮不了你。 判断信号:出现already borrowed: BorrowMutError,说明运行期借用规则被违反了。
A.2.6 Mutex<T> vs RwLock<T>
| 维度 | Mutex<T> | RwLock<T> |
|---|---|---|
| 并发度 | 任意时刻 1 个访问者 | 多个读者,或 1 个写者 |
| 锁开销 | 较小 | 较大,且各平台实现差异明显 |
| 饥饿风险 | 较低 | 写者可能被持续到来的读者饿死(依实现而定) |
| 常见配套 | Arc<Mutex<T>> | Arc<RwLock<T>> |
| 怎么选 | 默认 Mutex | 读远多于写、且读临界区较长时才考虑 |
⚠️ 陷阱:
RwLock并非一定更快。读临界区很短时,它的记账开销可能比Mutex还贵; 需要实测,别凭直觉换。
A.2.7 Fn / FnMut / FnOnce
| 维度 | FnOnce | FnMut | Fn |
|---|---|---|---|
| 可调用次数 | 至少一次(可以只用一次) | 任意多次 | 任意多次 |
| 捕获访问方式 | 可取走捕获值 | 可修改捕获值 | 只读捕获值 |
| 三者关系 | Fn: FnMut: FnOnce(后者更宽松) | 同左 | 同左 |
| 典型例子 | 把捕获的 String move 出去 | 计数器 count += 1 | 只读打印捕获变量 |
| 怎么选 | 参数类型尽量写 FnOnce,对调用方限制最小 | 需要改状态时用 | 只需只读时用 |
A.2.8 impl Trait vs dyn Trait
| 维度 | impl Trait | dyn Trait |
|---|---|---|
| 分发方式 | 静态分发(单态化) | 动态分发(查虚表) |
| 运行期开销 | 无,可内联 | 一次间接调用,通常无法内联 |
| 能否混装不同类型 | 不能,一个位置只能是一种具体类型 | 能,Vec<Box<dyn Trait>> 可装多种 |
| 二进制体积 | 每种类型一份代码,可能膨胀 | 一份代码 |
| 位置限制 | 参数位置任意;返回位置只能单一具体类型 | 需要指针包装:&dyn/Box<dyn>/Arc<dyn> |
| 怎么选 | 优先 impl Trait(快、类型安全) | 需在集合里装不同实现或给插件留接口时用 |
🧠 原理:返回
impl Trait的函数,返回类型由编译器推断但调用方看不见, 所以无法再调用该具体类型独有的方法,也无法为它单独写impl。
A.2.9 move 闭包 vs move 语义
| 维度 | move || ... 闭包 | let b = a;(move 语义) |
|---|---|---|
| 作用对象 | 闭包捕获外层变量的方式 | 赋值/传参时值的所有权转移 |
| 结果 | 变量被闭包按值拿走(Copy 类型是复制) | 原变量在 move 之后不可再用 |
| 常见触发场景 | thread::spawn、返回闭包、async move | 传 String/Vec 给函数、装进结构体 |
| 是否一定导致原变量失效 | 是(对非 Copy 类型) | 是(对非 Copy 类型) |
| 怎么选 | 闭包要活得比当前函数久时必须 move | 不需要原变量时直接 move,比 clone 便宜 |
⚠️ 陷阱:
move闭包拿走所有权后,外层变量就不能再用了。 若同时还要用,先.clone()一份喂给闭包,或改成传引用并保证生命周期足够长。
A.2.10 panic! vs Result
| 维度 | panic! | Result<T, E> |
|---|---|---|
| 触发时机 | 运行期,立刻展开栈或中止进程 | 编译期强制你处理(#[must_use]) |
| 调用方能否恢复 | 默认不能(可 catch_unwind,但不推荐当控制流) | 能 |
| 适用场景 | 编程错误、不变量被破坏、测试断言 | 可预期的失败:IO、解析、网络 |
| 库的默认策略 | 尽量避免,除非「调用方用错了」 | 默认返回 Result,让调用方决定 |
| 怎么选 | 不可恢复的 bug 才 panic! | 可恢复的失败一律返回 Result,配 ? 向上传播 |
A.2.11 Clone vs Copy
| 维度 | Copy | Clone |
|---|---|---|
| 触发方式 | 隐式:赋值、传参、放进容器都会复制 | 显式:必须写 .clone() |
| 语义 | 按位复制(bitwise copy) | 任意逻辑,可做深拷贝 |
与 Drop 关系 | 互斥:实现了 Drop 的不能是 Copy | 可以同时实现 |
| 典型类型 | i32、bool、char、&T、[T; N](当 T: Copy) | String、Vec<T>、Rc<T>、Arc<T> |
| 怎么选 | 小且无资源的类型加 Copy,让 API 更好用 | 需要独立副本时显式 .clone(),并注释说明为何必须克隆 |
A.2.12 'static 的两种含义
| 说法 | 准确含义 | 例子 |
|---|---|---|
| 「这个引用活到程序结束」 | 指向的数据在整个程序运行期都有效 | let s: &'static str = "hello"; |
| 「这个类型不借用短期数据」 | 类型里不含非 'static 的借用;值本身可以是局部的 | fn f<T: 'static>(t: T) 接受 String |
| 怎么选 | 看到 T: 'static 时不要理解成「值必须永远活着」 | 它只排除「带短期引用的类型」 |
⚠️ 陷阱:
Box<dyn Error + 'static>里的'static属于第二种含义。 它表示错误对象内部没有借用栈上的数据,而不是「错误对象永不释放」。
A.3 不翻译的保留词清单
以下词在正文中一律保留英文。理由:中文译名会让代码与散文对不上, 读者搜索时也搜不到对应资料。首次出现时写成「中文(English)」即可,之后直接用英文。
| 类别 | 保留词 | 说明 |
|---|---|---|
| 语法关键字 | let mut fn struct enum impl trait mod use where match if else loop while for return move ref dyn async await unsafe const static type as in pub crate self super | 语法关键字,写中文会导致代码与正文错位 |
| trait 名 | Copy Clone Debug Display Drop Default Iterator IntoIterator Send Sync Sized Unpin Deref From Into TryFrom TryInto AsRef Borrow | 类型系统里的专有名词,翻译反而歧义 |
| 类型名 | Option Result Some None Ok Err Box Rc Arc Cell RefCell Mutex RwLock Vec String HashMap BTreeMap Pin Cow AtomicUsize | 代码里必须原样写,正文也保持一致 |
| trait object 相关 | dyn vtable impl Trait dyn Trait | 「动态 trait 对象」这类说法太长且易误解 |
| 工具链 | cargo rustc rustup rustfmt clippy miri rustdoc serde tokio criterion | 命令与 crate 名,翻译后无法复制粘贴 |
| Cargo 配置 | Cargo.toml Cargo.lock [dependencies] [features] [dev-dependencies] workspace edition rust-version | 配置文件里就是这些字面量 |
| 诊断术语 | lint warn deny allow forbid span error code | 与编译器输出一一对应 |
💡 对照:Java 社区会把
interface译成「接口」,因为 Java 的关键字本身就有通用语义; 但 Rust 的trait没有等价的既有中文概念,硬译成「特征」会让它和日常用词混淆, 因此本站选择保留trait。
A.4 已废弃或易误解的旧译名提醒
下表列出常见但本站不采用的译法。「本文档采用」一栏是唯一合法写法。
| 英文 | 常见旧译 / 误译 | 问题 | 本文档采用 |
|---|---|---|---|
borrow | 出借 | 「出借」暗示要归还所有权,而借用只是临时访问权限,且 &mut 还有独占性 | 借用 |
ownership | 拥有权、持有权 | 与「所有权」混用会破坏检索一致性 | 所有权 |
lifetime | 生存期、寿命 | 「生存期」听起来像运行期时长,而 'a 描述的是引用之间的关系 | 生命周期 |
move | 搬移、转移 | 「转移」容易与「拷贝」混淆;move 是所有权换手,不是数据搬家 | 移动(移动语义) |
trait | 特征、特性 | 与 feature(特性开关)撞名,且 trait 是可带实现的契约 | trait(不译) |
trait object | 特征对象 | 同上,且按旧译搜索不到资料 | trait 对象 |
feature / feature flag | 特性、功能 | 与 trait 的旧译「特征」混淆 | 特性开关(feature flag) |
coherence | 连贯性 | 无法传达「实现必须唯一」这层含义 | 一致性 |
object safety | 对象安全性 | 容易被读成「内存安全」 | 对象安全,首次出现时注明旧称 |
elision | 省略法则 | 「法则」让人以为是必背清单,其实只是三条机械规则 | (生命周期)省略 |
variance | 变异性 | 与「可变性」mutability 撞词 | 型变,子项用协变/逆变/不变 |
mutability | 可变性 | 与型变区分开即可,但不要写成「易变性」 | 可变性 |
interior mutability | 内部易变性 | 不知所云 | 内部可变性 |
deref coercion | 解引用强制转换 | 太长,但正文必须固定,不要一会儿写「自动解引用」 | 解引用强制转换 |
blanket impl | 毯式实现、地毯实现 | 直译不通,读者无法理解「给所有满足约束的类型统一实现」 | 泛型实现,首次注明 blanket impl |
orphan rule | 孤儿法则 | 可以接受,但必须与「孤儿规则」统一 | 孤儿规则 |
monomorphization | 单态化 / 单形化 | 「单形化」少见,破坏检索 | 单态化 |
unsized | 无尺寸、不定长 | 两者都能见到,需固定 | 不定长;?Sized 语境下用「大小未知」 |
ZST(zero-sized type) | 零尺寸类型 | 可以接受,但不要写成「零大小」 | 零大小类型(ZST) |
RAII | 资源获取即初始化(直译) | 直译句子不通顺,需保留缩写 | RAII,首次写「资源获取即初始化(RAII)」 |
UB(undefined behavior) | 未定义行为 / 不明确行为 | 「不明确」严重误导:UB 不是「结果不确定」,而是不再保证任何事 | 未定义行为(UB) |
panic | 恐慌、崩溃 | 「恐慌」拟人化过强;「崩溃」不准确(默认是展开栈,可被捕获) | panic(不译) |
unwrap | 解包、拆包 | 与解构的「拆包」混淆 | unwrap(不译),必要时说「unwrap 掉」 |
closure | 闭包 / 闭包式函数 | 「闭包式函数」是错译,闭包不是函数的一种语法糖 | 闭包 |
capture | 捕捉 | 「捕捉」多用于异常,与环境捕获的语义不符 | 捕获 |
dangling pointer | 悬空指针 / 悬垂指针 | 两种都有,需固定 | 悬垂指针 |
fat pointer | 胖指针 | 形象且通用,但要固定用「胖指针」 | 胖指针 |
static dispatch 里的 static | 静态的(与「静止」混淆) | 这里指编译期,不是「不变化」 | 静态分发,并说明与 static 变量无关 |
guard(match guard) | 卫语句、守护 | Go 的 guard clause 是另一回事 | 守卫(match guard) |
binding | 绑定 / 绑扎 | 「绑扎」不可用 | 绑定 |
predicate | 谓词 | 数学味重但通用,可接受 | 谓词;where 语境下用约束条件 |
⚠️ 陷阱:读者若在网上先看到「出借」「生存期」「特征」等旧译, 回到本站时容易以为讲的是别的东西。写作时遇到这些词,先按本表译法改一次再引用。
A.5 术语使用自检清单
写完任何一章后,用下面几条自查:
延伸阅读
- Rust Book · 关键字附录:官方, 官方关键字与运算符列表,判断某词是否属于语法关键字时的第一依据。
- Rust Reference · Glossary:官方, 参考手册的术语定义,用于确认
dyn、unsized、variance等词的精确含义。 - The Rustonomicon:官方, unsafe 与未定义行为指南,
UB、vtable、型变的深入解释在此。 - Rust API 指南:官方, API 设计约定,判断
Copy/Clone何时该实现的依据之一。 - Rust 语言圣经(中文):非官方, 社区中文教程,术语旧译较多,对照本附录使用时注意差异。