iovxw

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: TraitT 可以作为 dyn Trait (T: Trait 实现了 Unsize<dyn Trait>)

然而光有 Unsize 并没有什么用, 因为 Rust 不允许在栈上创建 DST

所以需要智能指针, 在堆上创建 DST, 并且自动转换为动态分发, 上面提到的 Box<[u8]> 就是很好的例子 (不过 slicestr 是 primitive type, 不需要动态分发)

待续!剩下懒得写了