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