我编写了一个宏,它在 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
真的没有使用,也不会产生警告。
有没有办法让第一个例子不会产生警告,但第二个例子会?
可以使用带有警告的宏的完整代码,以及带有警告被抑制的完整代码。