Derive Macro Deref

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

Автореализация Deref и DerefMut для структур.

Макрос поддерживает работу с именованными и неименнованными структурами.

§Реализация с одним неименованным полем

Дефолтная реализация макроса без дополнительных указаний работает только с одним неименованым полем. При разименовании структуры будет возвращены данные этого поля.

use std_reset_macros::Deref;

#[derive(Deref)]
struct Wrapper(pub Vec<i32>);

let mut wrapper = Wrapper(vec![1, 2, 3]);
assert_eq!(*wrapper, vec![1, 2, 3]);

§Со множеством неименованных полей

Когда появляется несколько полей, макросу необходимо указать конретное поле, которое будет возвращено после разыменования с помощью атрибута #[deref].

#[derive(Deref)]
struct Wrapper(pub Vec<i32>, #[deref] pub String);

let mut wrapper = Wrapper(vec![1, 2, 3], String::from("crab"));
assert_eq!(*wrapper, "crab");

§Со множеством именованных полей

Тоже самое работает и с именованными полями:

#[derive(Deref)]
struct Wrapper {
    pub first: Vec<i32>,
    #[deref]
    pub second: String,
}

let mut wrapper = Wrapper {
    first: vec![1, 2, 3],
    second: String::from("crab"),
};
assert_eq!(*wrapper, "crab");