首页 文章

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

提问于
浏览
3

我已经编写了一个宏来实现类似Scala,用于Rust中的理解 . 它会变成这样:

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

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

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 回答

  • 2

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

相关问题