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

时间:2017-06-23 13:08:53

标签: rust rust-macros

我已经编写了一个宏,它可以在Rust中实现Scala-like。它会变成这样:

map_for!{
    x <- 0..4;
    y = 2*x;
    z <- 0..1;
    => y+z
}

进入这个:

((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 })
    })

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

map_for!{
    x <- 0..4;
    y = 2;
    z <- 0..1;
    => y+z
}

将扩展为:

((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 })
    })

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

有没有办法让第一个例子不会产生警告,但第二个例子会产生警告?

full code of the macro with warnings可用full code with warnings suppressed

1 个答案:

答案 0 :(得分:2)

我能想到的最简单的方法是通过使用一些惰性操作来确保x 使用。例如,您可以使用drop(&x);{let _ = &x;}。这些都不会对周围的代码产生任何影响,因为它们都会创建,然后立即放弃借用。