我有这段代码(playground):
trait NodeLike: Sized {}
fn main() {
let s: Box<NodeLike> = panic!();
}
哪个无法编译:
error[E0038]: the trait `NodeLike` cannot be made into an object
--> src/main.rs:4:12
|
4 | let s: Box<NodeLike> = panic!();
| ^^^^^^^^^^^^^ the trait `NodeLike` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`
尽管我读了所有的内容,但我仍然不明白为什么它没有约束Sized
也能编译通过。
据我所知:
Box<NodeLike>
被视为Box<dyn NodeLike>
,它对方法调用使用动态分派。Box<NodeLike>
无论其项类型如何,都被视为大小已确定。- 大小/非大小理论是必要的,因为有些类型的大小无法预先知道 (例如数组或字符串)。
- 特征上的
Sized
标记强制实现类型具有大小。
要求实现类型是Sized
与不能拥有该特征对象(使用动态分派的对象)有什么关系?
dyn
表示法。这是一种不太含糊的表示法。 - BoiethiosSized
标记基本上只是一个开关,用于启用或禁用给定特质的对象实例? - Henning