pub trait AsOut<Pointee>where
    Pointee: ?Sized,
{ fn as_out(&'out mut self) -> Out<'out, Pointee>; }
Expand description

Extension trait to convert a &mut _ into a &out _ by calling .as_out() on it.

By autoref, this means that you can even just extract a &out T reference out of a mut element simply by calling .as_out() on it.

There is, however, one restriction: to be able to call .as_out() on something, it needs to be either Copy, or a value wrapped in a MaybeUninit / a ManuallyDrop.

This is by design. Indeed, Out references do not call the destructor of the overwritten element (since it may not be initialized). This could cause memory leaks when there is an initialized element with drop glue.

To solve this limitation, one must explicitly call .manually_drop_mut() to automagically transmute the &mut _ reference into a &mut ManuallyDrop<_>.


use ::uninit::prelude::*;

let mut x = 0;

let mut y = ::core::mem::MaybeUninit::uninit();
let y = unsafe { y.assume_init() };

assert_eq!(x, y);

Required Methods

Implementations on Foreign Types