Rust 隐式转换之 CoerceUnsized
标题看起来像一个系列, 然而并不一定有后续
Rust 中有四种隐式类型转换 (别和我提回字怎么写), 其中三种都是为了简化代码, 就算没有隐式, 也可以显式地用其他方法写出来
唯有 CoerceUnsized
比较特殊, 提供了一种抽象, 没有它就无法写出包含 DST(Dynamically-sized Type) 的智能指针
像这样:
let x: [u8; 3] = [0, 0, 0];
let y: Box<[u8]> = Box::new(x);
在讲 CoerceUnsized
之前, 必须要说 Unsize
Unsize
是一个标记 trait, 表示一个类型可以被 "unsized" 到一个 DST, 像 [u8; 3]
可以 "unsized" 为 [u8]
([u8; 3]
实现了 Unsize<[u8]>
), 以及 T: Trait
的 T
可以作为 dyn Trait
(T: Trait
实现了 Unsize<dyn Trait>
)
然而光有 Unsize
并没有什么用, 因为 Rust 不允许在栈上创建 DST
所以需要智能指针, 在堆上创建 DST, 并且自动转换为动态分发, 上面提到的 Box<[u8]>
就是很好的例子 (不过 slice
和 str
是 primitive type, 不需要动态分发)