为什么这个宏会导致未解析的名称错误?

时间:2016-01-23 15:24:32

标签: macros rust

我想编译类似于这个最小测试用例的代码:

macro_rules! why {
    ( [ $saved:ident ] $body:block ) => {
        let $saved = 3;
        $body
        let _a = $saved;
    }
}

fn bar() {
    why!([saved] {
    });
}

fn main() {
}

当我尝试编译它时,我收到以下错误:

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

引入变量的其他宏工作;这有什么问题?

2 个答案:

答案 0 :(得分:7)

这是因为当涉及到扩展为语句的宏时,macro_rules!有点被打破。

基本上,问题在于它为了卫生目的而单独考虑每个语句 。换句话说,第三个语句字面上看不到在第一行定义的绑定。

在某些情况下,您可以通过将语句包装在块中来解决此问题:

macro_rules! why {
    ( [ $saved:ident ] $body:block ) => {
        {
            let $saved = 3;
            $body
            let _a = $saved;
        }
    }
}

答案 1 :(得分:1)

您的saved在调用网站的范围内没有任何名为public class DownloadComplete { private Bitmap bitmap; public DownloadComplete(Bitmap bitmap) { this.bitmap = bitmap; } public void displayImage(ImageView imageView) { imageView.setImageBitmap(bitmap); } } 的内容。