Reborrowing
Reborrowing is used in scopes to so that the View
structs don't hold onto the borrow for the length of 'ctx
, but only for the 'view
lifetime.
#[derive(Debug)]
struct Life<'life> {
value: &'life mut u8,
}
impl<'life> Life<'life> {
pub fn reborrow<'short>(&'short mut self) -> Life<'short> {
Life {
value: &mut self.value,
}
}
}
// Used in
struct Scope<'life> {
life: Life<'life>,
other: u16,
}
struct ScopeView<'view> {
life: Life<'view>,
other: &'view mut u16,
}
impl<'life> Scope<'life> {
pub fn view(&mut self) -> ScopeView<'_> {
let Scope { life, other } = self;
// Needed to shorten the lifetime of `'life`.
let life = life.reborrow();
ScopeView { life, other }
}
}
fn main() {
let mut value = 123;
let life = Life { value: &mut value };
let mut many_data = Scope { life, other: 456 };
let ScopeView {
life: _life,
other: _other,
} = many_data.view();
}