Unsize

Trait Unsize 

Source
pub trait Unsize<T: PointeeSized>: PointeeSized { }
🔬This is a nightly-only experimental API. (unsize #18598)
Expand description

Types that can be “unsized” to a dynamically-sized type.

For example, the sized array type [i8; 2] implements Unsize<[i8]> and Unsize<dyn fmt::Debug>.

All implementations of Unsize are provided automatically by the compiler. Those implementations are:

  • Arrays [T; N] implement Unsize<[T]>.
  • A type implements Unsize<dyn Trait + 'a> if all of these conditions are met:
    • The type implements Trait.
    • Trait is dyn-compatible1.
    • The type is sized.
    • The type outlives 'a.
  • Trait objects dyn TraitA + AutoA... + 'a implement Unsize<dyn TraitB + AutoB... + 'b> if all of these conditions are met:
    • TraitB is a supertrait of TraitA.
    • AutoB... is a subset of AutoA....
    • 'a outlives 'b.
  • Structs Foo<..., T1, ..., Tn, ...> implement Unsize<Foo<..., U1, ..., Un, ...>> where any number of (type and const) parameters may be changed if all of these conditions are met:
    • Only the last field of Foo has a type involving the parameters T1, …, Tn.
    • All other parameters of the struct are equal.
    • Field<T1, ..., Tn>: Unsize<Field<U1, ..., Un>>, where Field<...> stands for the actual type of the struct’s last field.

Unsize is used along with ops::CoerceUnsized to allow “user-defined” containers such as Rc to contain dynamically-sized types. See the DST coercion RFC and the nomicon entry on coercion for more details.


  1. Formerly known as object safe

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§