Macros 我可以使用宏替换代码块中的特定表达式吗?
我试图编写一组Rust宏,以特殊方式执行某些代码。目前,我是这样写的Macros 我可以使用宏替换代码块中的特定表达式吗?,macros,rust,Macros,Rust,我试图编写一组Rust宏,以特殊方式执行某些代码。目前,我是这样写的 macro_rules! macro_stmt{ ([$e:expr]) => { // do something ... } } 并称之为 macro_stmt!([...]); let var = macro_stmt!([...]); macro_stmt!([...]); // etc... 太棒了!基本上,我是以一种特殊的方式在方括号内运行一个表达式(省略号是某些未指定代码的
macro_rules! macro_stmt{
([$e:expr]) => {
// do something ...
}
}
并称之为
macro_stmt!([...]);
let var = macro_stmt!([...]);
macro_stmt!([...]);
// etc...
太棒了!基本上,我是以一种特殊的方式在方括号内运行一个表达式(省略号是某些未指定代码的占位符),而macro\u stmt
宏已经非常有效了
我希望能够编写一个宏,以便像运行代码块一样运行它:
macro_rules! macro {
// some rule to call macro_stmt!
// this pattern isn't correct, BTW
($($line:stmt);+;) => {
$(macro_stmt($line);)+
}
}
叫它
macro! {
[...];
let var = [...];
[...];
// etc...
}
但是编译器对我大喊大叫,因为stmt
片段的语法不正确,因为“array”的内容不是正确的逗号分隔格式
有没有一种方法可以在不检查语法的情况下逐行调用macro\u stmt
?没有let var=
的行将只调用macro\u stmt()
,但是带有let
的行将使用相同的let var=macro\u stmt()
作为前缀
宏的预期第一次扩展是
macro_stmt!([...]);
let var = macro_stmt!([...]);
macro_stmt!([...]);
这可能吗?我发现很难完全理解你的问题。[…]
应该是多少文字?[]
应该是文字,而..
是表示某些未指定代码的省略号吗?或者你想要三个
字符?你基本上是在问“在这个宏调用中,我想以一种特殊的方式专门处理每一个成对的方括号”?是的,抱歉,省略号是一些未指定的代码。昨天是漫长的一天。我在睡觉前贴的。