Unsized trait
可以是未定义大小的类型也可以是动态大小的类型。
1 - Unsize trait的std文档
Unsize trait的std文档
https://doc.rust-lang.org/std/marker/trait.Unsize.html
pub trait Unsize<T: ?Sized> {}
可以是未定义大小的类型也可以是动态大小的类型。
例如,按大小排列的数组类型 [i8; 2]
实现 Unsize<[i8]>
和 Unsize<dyn fmt::Debug>
。
Unsize
的所有实现均由编译器自动提供。
Unsize
为以下目的实现:
-
[T; N]
是Unsize<[T]>
-
当
T: Trait
时T
为Unsize<dyn Trait>
-
Foo<..., T, ...>
是Unsize<Foo<..., U, ...>>
,如果T: Unsize<U>
- Foo 是一个结构体
- 仅
Foo
的最后一个字段具有涉及T
的类型 T
不属于任何其他字段的类型Bar<T>: Unsize<Bar<U>>
, 如果Foo
的最后一个字段的类型为Bar<T>
Unsize
与 ops::CoerceUnsized
一起使用可允许 “user-defined” 容器 (例如 Rc
包含动态大小的类型。 有关更多详细信息,请参见 DST coercion RFC 和 the nomicon entry on coercion。
2 - Unsize trait的源码
Unsize trait的源码
https://github.com/rust-lang/rust/blob/master/library/core/src/marker.rs
#[unstable(feature = "unsize", issue = "27732")]
#[lang = "unsize"]
pub trait Unsize<T: ?Sized> {
// Empty.
}