如何在传递给宏的代码中使用宏定义的标识符?

时间:2019-04-19 18:48:25

标签: rust rust-macros

我有一个宏cb_arc,该宏用于创建具有深层嵌套类型的回调。我对回调有一些输入,可以在宏的不同部分中使用。

在仔细阅读了过程宏的文档(略有不连贯性)之后,我或多或少地放弃了,转而使用声明性宏并写下了这一点:

#[macro_export]
macro_rules! cb_arc {
    ( $name:literal, $v:ident, $s:ident, {$($head:tt)*} ) => {
        {
            use log::trace;
            let arc = std::sync::Arc::new(std::sync::Mutex::new(
                move |$s: &$crate::io::e::State, $v: &$crate::io::e::V| {
                    trace!("{:?} update fired with {:?}", $name, $v);
                    $($head)*;
                    trace!("{:?} handler completed.", $name);
                }
            ));
            // might want to do more things here w/ arc later
            arc
        }
    }
}

这可行,但是我必须编写如下的宏调用:

cb_arc!("Exit", v, s, {
    debug!("Value: {:?}, State: {:?}", v, s);
    // do stuff to set exit flag/properly handle event/etc
})

练习的全部目的是消除长函数调用,所以现在就可以了,但这是目标:

cb_arc!("Exit", {
    debug!("Value: {:?}, State: {:?}", v, s);
    // do stuff to set exit flag/properly handle event/etc
})

我应该如何做到这一点?可能吗另外,是否可以将通配符(_)用作标识符?

0 个答案:

没有答案