宏生成的代码中未使用的变量

Jmb*_*Jmb 5 rust rust-macros

我编写了一个宏,它在 Rust 中实现了类似 Scala 的理解。它将变成这样:

map_for!{
    x <- 0..4;
    y = 2*x;
    z <- 0..1;
    => y+z
}
Run Code Online (Sandbox Code Playgroud)

进入这个:

((0..4).map (move |x| { let y = 2 * x; (x, y) }))
    .flat_map (move |params| {
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })
Run Code Online (Sandbox Code Playgroud)

x这是可行的,但编译器会发出“未使用的变量”警告,因为flat_map. 我可以通过在宏中的语句#[allow(unused_variables)]之前添加来禁用警告,但随后它会删除所有未使用的变量警告,因此:let

map_for!{
    x <- 0..4;
    y = 2;
    z <- 0..1;
    => y+z
}
Run Code Online (Sandbox Code Playgroud)

将扩展为:

((0..4).map (move |x| { let y = 2; (x, y) }))
    .flat_map (move |params| {
        #[allow(unused_variables)]
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })
Run Code Online (Sandbox Code Playgroud)

x即使确实没有使用,也不会生成警告。

有没有办法使第一个示例不会生成警告,但第二个示例会生成警告?

带有警告的宏的完整代码以及带有抑制警告的完整代码都可用。