Ржавый путь волхвов c методами - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу отобразить все дочерние методы структуры на родительские с уменьшением некоторых параметров.

Вот пример: -

PlayGround: - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0610b6abd57ab3d65435c821829e156b


struct World;
struct Sibling;

struct Parent {
    pub child: Child,
    pub sibling: Sibling
}

impl Parent {
    pub fn new()->Parent {
        Parent {
            sibling: Sibling,
            child: Child,
        }
    }
}

struct Child;

impl Child {
    pub fn set_x(&mut self, _world: &mut World, _sibling: &mut Sibling, _x: f32 ){
        // ..
    }

    pub fn set_y(&mut self, _world: &mut World, _sibling: &mut Sibling, _y: f32){
        // ..
    }

    // 32 methods that taking World as first parameter and Sibling as second parameter
}

fn main(){

    let mut world = World;

    let mut parent = Parent::new();

    parent.child.set_x(&mut world,&mut parent.sibling,0.23);
    parent.child.set_y(&mut world,&mut parent.sibling, 0.12);

    // Expectation:-
    // parent.set_x(&mut world,0.23)
    // parent.set_y(&mut world, 1.23)

}

Родитель знает, кто брат, кто ребенок. Нет необходимости в руководстве из глобальной области. Мне нужно спрятать ребенка и родного брата от внешнего пространства. И я попробовал следующим образом.


impl Parent {

    pub fn set_x(&mut self, world: &mut World, x: f32){
        self.child.set_x(world, &mut self.sibling, x);
    }

    // ...
}

Но у меня есть 32 метода. Это не ясный путь.

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете сделать это с помощью простого макроса:

macro_rules! map_methods {
    ($stype:ty { $($method:ident ($($param:ident : $ptype:ty),*);)* }) => {
        impl $stype {
            $(
            fn $method (&mut self, world: &mut World, $($param: $ptype),*) {
                self.child.$method (world, &mut self.sibling, $($param),*)
            }
            )*
        }
    }
}

, который вы затем используете следующим образом:

map_methods!{ Parent {
    set_x (_x: f32);
    set_y (_y: f32);
}}

Детская площадка

PS: Обязательное чтение при запуске с макросами Rust: Маленькая книга макросов Rust

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...