我曾try 使用特定模式在宏调用中传递本地对象,但失败了.例如:

macro_rules! run_map {
    (($vector: expr).map(($closure: expr))) => {
        $vector().iter().map($closure: expr).collect::<Vec<_>>()
    };
}

fn main() {
    let my_vector: Vec<i32> = vec![3,4,5];
    run_map!(my_vector.map(|e| e * e));
}

下面是我得到的错误:

run_map!(my_vector.map(|e| e * e));
         ^^^^^^^^^ no rules expected this token in macro call

如何提取对象并在宏中的表达式中单独使用它们?

推荐答案

宏中的表达式必须以某种方式分隔.

macro_rules! run_map {
    (($vector: expr).map($closure: expr)) => {
        // remove the () after $vector and the :expr after $closure here
        $vector.iter().map($closure).collect::<Vec<_>>()
    };
}

fn main() {
    let my_vector: Vec<i32> = vec![3,4,5];
    // add () around my_vector and the closure here
    let out = run_map!((my_vector).map(|e| e * e));
    println!("{out:?}");
}

See demo in the rust playground

宏需要能够确定您想要和不想要的表达式的哪一部分.因此,它必须被诸如{}()[]之类的表达式中无效的部分包围.甚至是像这样的事情:

($vector: expr;.map(($closure: expr))) => {

之所以有效,是因为;是表达式的有效位数

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

trait声明中的生命周期参数

为什么std repeat trait绑定在impl块和关联函数之间?

"value is never read警告似乎不正确.我应该忽略它吗?

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

取得本地对象字段的所有权

在生存期内将非静态可变引用转换为范围内的静态可变引用

了解Rust';s特征对象和不同函数签名中的生存期注释

Rust Axum 框架 - 解包安全吗?

一次不能多次borrow *obj作为可变对象

将 &str 或 String 保存在变量中

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

在 Rust 中实现资源消耗的安全包装器

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

如何在 Rust 中将 bson::Bson 转换为 Vec

为什么具有 Vec 变体的枚举没有内存开销?

在 Rust 中退出进程

有没有办法在 Rust 中对 BigInt 进行正确的位移?

有没有办法使用 NASM 语法进行内联汇编?

如何从 Rust 函数返回数组而不复制它们?