我已经编写了一个宏,它可以在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。
答案 0 :(得分:2)
我能想到的最简单的方法是通过使用一些惰性操作来确保x
被使用。例如,您可以使用drop(&x);
或{let _ = &x;}
。这些都不会对周围的代码产生任何影响,因为它们都会创建,然后立即放弃借用。