4

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

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真的没有使用,也不会产生警告。

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

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

4

1 回答 1

2

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

于 2017-06-23T13:26:11.163 回答