首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以从传递的expr中访问在锈蚀宏中定义的变量?

是否有一种方法可以从传递的expr中访问在锈蚀宏中定义的变量?
EN

Stack Overflow用户
提问于 2022-01-13 04:43:03
回答 1查看 127关注 0票数 1

假设我想使以下宏工作:

代码语言:javascript
复制
macro_rules! process_numbers {
    ($name:ident, $process:expr) => {
        let $name: Vec<_> = vec![0, 1, 2].iter().map(|num| {
            println!("{}", path); // dummy preprocessing
            let foo = 3; // some other preprocessing involving side-effects
            $process
        }).collect();
    }
}

process_numbers!(name, {
    num + foo
});

有没有办法让我可以从num内部访问foo$process

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-13 05:01:45

锈蚀宏是卫生学。这意味着宏体内定义的标识符不会泄漏出去。

解决这一问题的一种方法是修改宏,使其接收标识符作为参数。

代码语言:javascript
复制
macro_rules! process_numbers {
    ($name:ident, |$num:ident, $foo: ident| $process:expr) => {
        let $name: Vec<_> = vec![0, 1, 2].iter().map(|$num| {
            println!("{}", path); // dummy preprocessing
            let $foo = 3; // some other preprocessing involving side-effects
            $process
        }).collect();
    }
}

process_numbers!(name, |num, foo| {
    num + foo
});

这里,我使用了类似于闭包的语法,这意味着|num, foo|声明参数(它们实际上声明变量--足够接近了!)。

另一种方法是使$process参数成为宏将调用的文字闭包(或任何可调用的表达式),并将numfoo作为参数传递。

代码语言:javascript
复制
macro_rules! process_numbers {
    ($name:ident, $process:expr) => {
        let $name: Vec<_> = vec![0, 1, 2].iter().map(|num| {
            println!("{}", path); // dummy preprocessing
            let foo = 3; // some other preprocessing involving side-effects
            $process(num, foo)
        }).collect();
    }
}

process_numbers!(name, |num, foo| {
    num + foo
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70691520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档