What #[derive(AsMut)] generates
Deriving AsMut
generates one or more implementations of AsMut
, each
corresponding to one of the fields of the decorated type.
This allows types which contain some T
to be passed anywhere that an
AsMut<T>
is accepted.
1 Newtypes and Structs with One Field
When AsMut
is derived for a newtype or struct with one field, a single
implementation is generated to expose the underlying field.
#[derive(AsMut)] struct MyWrapper(String);
Generates:
impl AsMut<String> for MyWrapper { fn as_mut(&mut self) -> &mut String { &mut self.0 } }
It’s also possible to use the #[as_mut(forward)]
attribute to forward
to the as_mut
implementation of the field. So here SigleFieldForward
implements all AsMut
for all types that Vec<i32>
implements AsMut
for.
#[derive(AsMut)] #[as_mut(forward)] struct SingleFieldForward(Vec<i32>); fn main() { let mut item = SingleFieldForward(vec![]); let _: &mut [i32] = (&mut item).as_mut(); }
This generates:
impl<__AsMutT: ?::core::marker::Sized> ::core::convert::AsMut<__AsMutT> for SingleFieldForward where Vec<i32>: ::core::convert::AsMut<__AsMutT>, { #[inline] fn as_mut(&mut self) -> &mut __AsMutT { <Vec<i32> as ::core::convert::AsMut<__AsMutT>>::as_mut(&mut self.0) } }
2 Structs with Multiple Fields
When AsMut
is derived for a struct with more than one field (including tuple
structs), you must also mark one or more fields with the #[as_mut]
attribute.
An implementation will be generated for each indicated field.
You can also exclude a specific field by using #[as_mut(ignore)]
.
#[derive(AsMut)] struct MyWrapper { #[as_mut] name: String, #[as_mut] num: i32, valid: bool, }
Generates:
impl AsMut<String> for MyWrapper { fn as_mut(&mut self) -> &mut String { &mut self.name } } impl AsMut<i32> for MyWrapper { fn as_mut(&mut self) -> &mut i32 { &mut self.num } }
Note that AsMut<T>
may only be implemented once for any given type T
. This means any attempt to
mark more than one field of the same type with #[as_mut]
will result in a compilation error.
// Error! Conflicting implementations of AsMut<String> #[derive(AsMut)] struct MyWrapper { #[as_mut] str1: String, #[as_mut] str2: String, }
3 Enums
Deriving AsMut
for enums is not supported.