rust - Access to self from the parameters of a macro that creates a struct -


i'm trying write macro generates struct. implementation struct generated macro, blocks of code provided macro arguments. here minimal example of such macro:

macro_rules! make_struct {     ($name:ident $block:block) => {         struct $name {             foo: i32,         }          impl $name {             fn new() -> self {                 $name { foo: 42 }             }             fn act (&self) {                 $block             }         }     }; } 

and here example of how macro can used:

fn main() {     // works     make_struct!(test { println! ("bar: {:?}", 24); });     let test = test::new();     test.act(); } 

i give access self inside supplied code. like:

fn main() {     // not work     make_struct!(test { println! ("foo: {:?}", self.foo); });     let test = test::new();     test.act(); } 

i understand not work because of macro hygiene rules. specifically, self.foo expression evaluated in syntax context of main function, self not exist. question is: there way modify macro self may accessed user-supplied code?

code on playground

you can pass closure instead of block.

make_struct!(test |this| println!("foo: {:?}", this.foo)); 

then macro can use closure , call self:

macro_rules! make_struct {     ($name:ident $closure:expr) => {         struct $name {             foo: i32,         }          impl $name {             fn new() -> self {                 $name { foo: 42 }             }             fn act (&self) {                 let x: &fn(&self) = &$closure;                 x(self)             }         }     }; } 

the dance let binding necessary, because type of this in closure can't inferred (yet?). , makes macro's error reporting little more readable when other closure passed.


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -