我有一个宏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
})
我应该如何做到这一点?可能吗另外,是否可以将通配符(_
)用作标识符?