我想编译类似于这个最小测试用例的代码:
macro_rules! why {
( [ $saved:ident ] $body:block ) => {
let $saved = 3;
$body
let _a = $saved;
}
}
fn bar() {
why!([saved] {
});
}
fn main() {
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误:
src/main.rs:10:20: 10:21 error: unresolved name `saved` [E0425]
src/main.rs:10 why!([saved] {
^
src/main.rs:10:9: 11:12 note: in this expansion of why! (defined in src/main.rs)
src/main.rs:10:20: 10:21 help: run `rustc --explain E0425` to see a detailed explanation
Run Code Online (Sandbox Code Playgroud)
引入变量的其他宏工作; 这有什么问题?
这是因为macro_rules!当涉及扩展到语句的宏时,它有点被打破.
问题基本上是它为了卫生目的独立地考虑每个陈述.换句话说,第三个语句字面上看不到第一行定义的绑定.
在某些情况下,您可以通过将语句包装在块中来解决此问题:
macro_rules! why {
( [ $saved:ident ] $body:block ) => {
{
let $saved = 3;
$body
let _a = $saved;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |