bevy_derive

Derive Macro DerefMut

Source
#[derive(DerefMut)]
{
    // Attributes available to this derive:
    #[deref]
}
Expand description

Implements DerefMut for structs. This is especially useful when utilizing the newtype pattern.

For single-field structs, the implementation automatically uses that field. For multi-field structs, you must specify which field to use with the #[deref] attribute.

DerefMut requires a Deref implementation. You can implement it manually or use Bevy’s derive macro for convenience.

§Example

§Tuple Structs

Using a single-field struct:

use bevy_derive::{Deref, DerefMut};

#[derive(Deref, DerefMut)]
struct MyNewtype(String);

let mut foo = MyNewtype(String::from("Hello"));
foo.push_str(" World!");
assert_eq!("Hello World!", *foo);

Using a multi-field struct:

use bevy_derive::{Deref, DerefMut};

#[derive(Deref, DerefMut)]
struct MyStruct<T>(#[deref] String, PhantomData<T>);

let mut foo = MyStruct(String::from("Hello"), PhantomData::<usize>);
foo.push_str(" World!");
assert_eq!("Hello World!", *foo);

§Named Structs

Using a single-field struct:

use bevy_derive::{Deref, DerefMut};

#[derive(Deref, DerefMut)]
struct MyStruct {
  value: String,
}

let mut foo = MyStruct {
  value: String::from("Hello")
};
foo.push_str(" World!");
assert_eq!("Hello World!", *foo);

Using a multi-field struct:

use bevy_derive::{Deref, DerefMut};

#[derive(Deref, DerefMut)]
struct MyStruct<T> {
  #[deref]
  value: String,
  _phantom: PhantomData<T>,
}

let mut foo = MyStruct {
  value:String::from("Hello"),
  _phantom:PhantomData::<usize>
};
foo.push_str(" World!");
assert_eq!("Hello World!", *foo);