Trait core::ops::CoerceUnsized
source · pub trait CoerceUnsized<T: ?Sized> { }
🔬This is a nightly-only experimental API. (
coerce_unsized
#18598)Expand description
一个 trait,指示这是一个指针或一个包装器,其中可以对指针调整大小。
有关更多详细信息,请参见 DST 强制 RFC 和 关于强制的 nomicon 入口。
对于内置指针类型,如果 T: Unsize<U>
通过从精简指针转换为胖指针,则指向 T
的指针将强制指向指向 U
的指针。
对于自定义类型,这里的强制通过将 Foo<T>
强制为 Foo<U>
来工作 (如果存在 CoerceUnsized<Foo<U>> for Foo<T>
的实现)。
仅当 Foo<T>
仅具有涉及 T
的单个非虚拟数据字段时,才可以写这样的 impl。
如果该字段的类型为 Bar<T>
,则必须存在 CoerceUnsized<Bar<U>> for Bar<T>
的实现。
coercion 将通过将 Bar<T>
字段强制转换为 Bar<U>
并填充 Foo<T>
的其余字段以创建 Foo<U>
来起作用。
这将有效地向下钻取指针字段并将其强制。
通常,对于智能指针,您将实现 CoerceUnsized<Ptr<U>> for Ptr<T> where T: Unsize<U>, U: ?Sized
,并在 T
本身上绑定了可选的 ?Sized
。
对于直接嵌入 T
的包装器类型 (例如 Cell<T>
和 RefCell<T>
),您可以直接实现 CoerceUnsized<Wrap<U>> for Wrap<T> where T: CoerceUnsized<U>
。
这将使像 Cell<Box<T>>
这样的强制类型起作用。
Unsize
用于标记在指针后面可以强制转换为 DST 的类型。它由编译器自动实现。