第11章 特殊类型与 Trait
4 分钟阅读
译文 · 基于 The Rust Reference
原文链接: https://doc.rust-lang.org/reference/special-types-and-traits.html
r[lang-types]
特殊类型与 Trait
r[lang-types.intro] 标准库中的某些类型与 trait 为 Rust 编译器所知。本章记录这些类型与 trait 的特殊功能。
r[lang-types.box]
Box<T>
r[lang-types.box.intro]
[Box<T>] 具有若干目前不允许用户自定义类型拥有的特殊功能。
r[lang-types.box.deref]
r[lang-types.box.receiver]
- 方法可以将
Box<Self>作为接收者。
r[lang-types.box.fundamental]
- 可以在与
T相同的 crate 中为Box<T>实现 trait,而孤儿规则对其他泛型类型会禁止这种做法。
r[lang-types.rc]
Rc<T>
r[lang-types.rc.receiver]
方法可以将 Rc<Self> 作为接收者。
r[lang-types.arc]
Arc<T>
r[lang-types.arc.receiver]
方法可以将 Arc<Self> 作为接收者。
r[lang-types.pin]
Pin<P>
r[lang-types.pin.receiver]
方法可以将 Pin<P> 作为接收者。
r[lang-types.unsafe-cell]
UnsafeCell<T>
r[lang-types.unsafe-cell.interior-mut]
[std::cell::UnsafeCell<T>] 用于内部可变性。它确保编译器不会对此类类型执行不正确的优化。
r[lang-types.unsafe-cell.read-only-alloc]
它还确保类型具有内部可变性的 static 项 不会被放入标记为只读的内存中。
r[lang-types.phantom-data]
PhantomData<T>
[std::marker::PhantomData<T>] 是一种零大小、最小对齐的类型;就变性、析构检查以及自动 trait而言,它被视为拥有一个 T。
r[lang-types.va-list]
VaList<'_>
注意
VaList在 ABI 上与 C 的va_list类型兼容;参见 [items.fn.c-variadic.abi-compatibility]。
r[lang-types.ops]
运算符 trait
[std::ops] 与 [std::cmp] 中的 trait 用于重载运算符、索引表达式以及调用表达式。
r[lang-types.deref]
Deref 与 DerefMut
除了重载一元 * 运算符外,Deref 与 DerefMut 还用于方法解析以及解引用强制转换。
r[lang-types.drop]
Drop
[Drop] trait 提供析构器,在该类型的值将被销毁时运行。
r[lang-types.copy]
Copy
r[lang-types.copy.intro]
[Copy] trait 会改变实现它的类型的语义。
r[lang-types.copy.behavior]
实现了 Copy 的类型的值在赋值时会被复制,而不是移动。
r[lang-types.copy.constraint]
Copy 只能为未实现 Drop、且其所有字段都是 Copy 的类型实现。对枚举而言,这意味着所有变体的所有字段都必须是 Copy。对联合体而言,这意味着所有变体都必须是 Copy。
r[lang-types.copy.builtin-types]
编译器会为以下类型实现 Copy:
r[lang-types.copy.tuple]
- 由
Copy类型组成的元组
r[lang-types.copy.fn-pointer]
r[lang-types.copy.fn-item]
r[lang-types.copy.closure]
- 未捕获任何值、或仅捕获
Copy类型值的闭包
r[lang-types.clone]
Clone
r[lang-types.clone.intro]
[Clone] trait 是 Copy 的超 trait,因此也需要由编译器生成实现。
r[lang-types.clone.builtin-types] 编译器为以下类型实现它:
r[lang-types.clone.builtin-copy]
- 具有内建
Copy实现的类型(见上文)
r[lang-types.clone.tuple]
- 由
Clone类型组成的元组
r[lang-types.clone.closure]
- 仅捕获
Clone类型值、或未从环境捕获任何值的闭包
r[lang-types.send]
Send
[Send] trait 表示该类型的值可以安全地从一个线程发送到另一个线程。
r[lang-types.sync]
Sync
r[lang-types.sync.intro]
[Sync] trait 表示该类型的值可以安全地在多个线程之间共享。
r[lang-types.sync.static-constraint]
用于不可变 static 项 的所有类型都必须实现此 trait。
r[lang-types.termination]
Termination
Termination trait 表示 main 函数与测试函数可接受的返回类型。
r[lang-types.auto-traits]
自动 trait
[Send]、[Sync]、Unpin、UnwindSafe 与 RefUnwindSafe trait 是自动 trait。自动 trait 具有特殊性质。
r[lang-types.auto-traits.auto-impl] 若未为给定类型写出自动 trait 的显式实现或否定实现,则编译器会按下列规则自动实现它:
r[lang-types.auto-traits.builtin-composite]
- 若
T实现该 trait,则&T、&mut T、*const T、*mut T、[T; n]与[T]也实现该 trait。
r[lang-types.auto-traits.fn-item-pointer]
- 函数项类型与函数指针自动实现该 trait。
r[lang-types.auto-traits.aggregate]
- 若结构体、枚举、联合体与元组的所有字段都实现该 trait,则它们也实现该 trait。
r[lang-types.auto-traits.closure]
- 若闭包所捕获的所有类型都实现该 trait,则闭包也实现该 trait。以共享引用捕获
T、以值捕获U的闭包,会实现&T与U都实现的那些自动 trait。
r[lang-types.auto-traits.generic-impl]
对于泛型类型(将上述内建类型视为关于 T 的泛型),若已有泛型实现可用,则对于本可使用该实现、但因不满足所需 trait 约束而无法使用的类型,编译器不会自动实现。例如,标准库为所有 T: Sync 的 &T 实现了 Send;这意味着若 T 是 Send 但不是 Sync,编译器不会为 &T 实现 Send。
r[lang-types.auto-traits.negative]
自动 trait 也可以有否定实现,在标准库文档中写作 impl !AutoTrait for T,用于覆盖自动实现。例如 *mut T 有 Send 的否定实现,因此即便 T 是 Send,*mut T 也不是 Send。目前尚无稳定方式指定额外的否定实现;它们仅存在于标准库中。
r[lang-types.auto-traits.trait-object-marker]
自动 trait 可以作为额外约束添加到任何trait 对象上,即便通常只允许一个 trait。例如,Box<dyn Debug + Send + UnwindSafe> 是有效类型。
r[lang-types.sized]
Sized
r[lang-types.sized.intro]
[Sized] trait 表示该类型的大小在编译时已知;也就是说,它不是动态大小类型。
r[lang-types.sized.implicit-sized]
类型参数(trait 中的 Self 除外)默认是 Sized 的,关联类型亦然。
r[lang-types.sized.implicit-impl]
Sized 始终由编译器自动实现,而非由实现项实现。
r[lang-types.sized.relaxation]
这些隐式的 Sized 约束可通过使用特殊的 ?Sized 约束来放宽。