4.2.7 Dyn 兼容性
07-Dyn 兼容性 — Comprehensive Rust
1分钟内可阅读完
译文 · 基于 Comprehensive Rust
4.2.7 Dyn 兼容性
| |
并非所有 trait 都能作为 trait 对象来调用。能这样调用的 trait 称为 dyn 兼容(dyn compatible)的 trait。
这以前叫 对象安全的 trait(object safe traits)或 对象安全(object safety)。
动态分发把大量编译期类型信息卸载到运行时的虚表信息中。
若某个概念无法有意义地存入虚表,要么该 trait 不再 dyn 兼容,要么那些方法被排除在 dyn 上下文之外。
当某 trait 的所有父 trait 都 dyn 兼容,且没有关联常量/类型、也没有依赖泛型的方法时,该 trait 是 dyn 兼容的。
你最常遇到 dyn 不兼容的 trait,是因为它们有关联类型/常量,或返回
Self(例如 Clone trait 不是 dyn 兼容的)。因为关联数据必须存进虚表,会占用额外内存。
对于像
clone这样的方法,返回类型取决于self的具体类型,因此取消了 dyn 兼容性。参考: