generational_box

Struct GenerationalRefMut

Source
pub struct GenerationalRefMut<W> { /* private fields */ }
Expand description

A mutable reference to a value in a generational box. This reference acts similarly to std::cell::RefMut, but has extra debug information to track when all references to the value are created and dropped.

GenerationalRefMut implements DerefMut which means you can call methods on the inner value just like you would on a mutable reference to the inner value. If you need to get the inner reference directly, you can call GenerationalRefMut::deref_mut.

§Example

let owner = UnsyncStorage::owner();
let mut value = owner.insert(String::from("hello"));
let mut mutable_reference = value.write();

// You call methods like `push_str` on the reference just like you would with the inner String
mutable_reference.push_str("world");

§Matching on GenerationalMut

You need to get the inner mutable reference with GenerationalRefMut::deref_mut before you match the inner value. If you try to match without calling GenerationalRefMut::deref_mut, you will get an error like this:

enum Colors {
    Red(u32),
    Green
}
let owner = UnsyncStorage::owner();
let mut value = owner.insert(Colors::Red(0));
let mut mutable_reference = value.write();

match mutable_reference {
    // Since we are matching on the `GenerationalRefMut` type instead of &mut Colors, we can't match on the enum directly
    Colors::Red(brightness) => *brightness += 1,
    Colors::Green => {}
}
error[E0308]: mismatched types
  --> packages/generational-box/tests/basic.rs:25:9
   |
9  |     match mutable_reference {
   |           ----------------- this expression has type `GenerationalRefMut<RefMut<'_, fn(u32) -> Colors {Colors::Red}>>`
10 |         // Since we are matching on the `GenerationalRefMut` type instead of &mut Colors, we can't match on the enum directly
11 |         Colors::Red(brightness) => *brightness += 1,
   |         ^^^^^^^^^^^^^^^^^^^^^^^ expected `GenerationalRefMut<RefMut<'_, ...>>`, found `Colors`
   |
   = note: expected struct `GenerationalRefMut<RefMut<'_, fn(u32) -> Colors {Colors::Red}>>`
               found enum `Colors`

Instead, you need to call deref mut on the reference to get the inner value before you match on it:

use std::ops::DerefMut;
enum Colors {
    Red(u32),
    Green
}
let owner = UnsyncStorage::owner();
let mut value = owner.insert(Colors::Red(0));
let mut mutable_reference = value.write();

// DerefMut converts the `GenerationalRefMut` into a `&mut Colors`
match mutable_reference.deref_mut() {
    // Now we can match on the inner value
    Colors::Red(brightness) => *brightness += 1,
    Colors::Green => {}
}

Implementations§

Source§

impl<T: ?Sized + 'static, R: DerefMut<Target = T>> GenerationalRefMut<R>

Source

pub fn map<R2, F: FnOnce(R) -> R2>(self, f: F) -> GenerationalRefMut<R2>

Map the inner value to a new type

Source

pub fn try_map<R2, F: FnOnce(R) -> Option<R2>>( self, f: F, ) -> Option<GenerationalRefMut<R2>>

Try to map the inner value to a new type

Trait Implementations§

Source§

impl<T: ?Sized, W: DerefMut<Target = T>> Deref for GenerationalRefMut<W>

Source§

type Target = T

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<T: ?Sized, W: DerefMut<Target = T>> DerefMut for GenerationalRefMut<W>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.

Auto Trait Implementations§

§

impl<W> Freeze for GenerationalRefMut<W>
where W: Freeze,

§

impl<W> !RefUnwindSafe for GenerationalRefMut<W>

§

impl<W> Send for GenerationalRefMut<W>
where W: Send,

§

impl<W> Sync for GenerationalRefMut<W>
where W: Sync,

§

impl<W> Unpin for GenerationalRefMut<W>
where W: Unpin,

§

impl<W> !UnwindSafe for GenerationalRefMut<W>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more