pub trait AsMut<T>where
T: ?Sized,{
// Required method
fn as_mut(&mut self) -> &mut T;
}Expand description
Used to do a cheap mutable-to-mutable reference conversion.
This trait is similar to AsRef but used for converting between mutable
references. If you need to do a costly conversion it is better to
implement From with type &mut T or write a custom function.
Note: This trait must not fail. If the conversion can fail, use a
dedicated method which returns an Option<T> or a Result<T, E>.
§Generic Implementations
AsMut auto-dereferences if the inner type is a mutable reference
(e.g.: foo.as_mut() will work the same if foo has type &mut Foo or &mut &mut Foo).
Note that due to historic reasons, the above currently does not hold generally for all
mutably dereferenceable types, e.g. foo.as_mut() will not work the same as
Box::new(foo).as_mut(). Instead, many smart pointers provide an as_mut implementation which
simply returns a reference to the pointed-to value (but do not perform a cheap
reference-to-reference conversion for that value). However, AsMut::as_mut should not be
used for the sole purpose of mutable dereferencing; instead ‘Deref coercion’ can be used:
let mut x = Box::new(5i32);
// Avoid this:
// let y: &mut i32 = x.as_mut();
// Better just write:
let y: &mut i32 = &mut x;Types which implement DerefMut should consider to add an implementation of AsMut<T> as
follows:
impl<T> AsMut<T> for SomeType
where
<SomeType as Deref>::Target: AsMut<T>,
{
fn as_mut(&mut self) -> &mut T {
self.deref_mut().as_mut()
}
}§Reflexivity
Ideally, AsMut would be reflexive, i.e. there would be an impl<T: ?Sized> AsMut<T> for T
with