Trait uninit::extension_traits::AsOut
source · pub trait AsOut<Pointee: ?Sized> {
// Required method
fn as_out<'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<_>
.
Examples
use ::uninit::prelude::*;
let mut x = 0;
x.as_out().write(42);
let mut y = ::core::mem::MaybeUninit::uninit();
y.as_out().write(42);
let y = unsafe { y.assume_init() };
assert_eq!(x, y);