我编写了一个宏,它在 Rust 中实现了类似 Scala 的理解。它将变成这样:
map_for!{
x <- 0..4;
y = 2*x;
z <- 0..1;
=> y+z
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
((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 })
})
Run Code Online (Sandbox Code Playgroud)
x
这是可行的,但编译器会发出“未使用的变量”警告,因为flat_map
. 我可以通过在宏中的语句#[allow(unused_variables)]
之前添加来禁用警告,但随后它会删除所有未使用的变量警告,因此:let
map_for!{
x <- 0..4;
y = 2;
z <- 0..1;
=> y+z
}
Run Code Online (Sandbox Code Playgroud)
将扩展为:
((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 })
})
Run Code Online (Sandbox Code Playgroud)
x
即使确实没有使用,也不会生成警告。
有没有办法使第一个示例不会生成警告,但第二个示例会生成警告?
带有警告的宏的完整代码以及带有抑制警告的完整代码都可用。
我能想到的最简单的方法是通过使用一些惰性操作来确保正在使用x
。例如,您可以使用drop(&x);
或{let _ = &x;}
。这些都不会对周围的代码产生任何影响,因为它们都会创建借用,然后立即放弃借用。
归档时间: |
|
查看次数: |
1054 次 |
最近记录: |