如何解决Rust宏中闭包声明处调用的Clippy警告?
解决Clippy关于闭包在声明处调用的警告
Clippy给出的这个警告,本质是宏展开后,每次循环都会重新创建闭包实例,紧接着就调用它。虽然代码能正常运行,但这种写法会重复生成闭包(哪怕编译器可能优化掉重复创建的开销),Clippy认为这不符合Rust的最佳实践。
要消除警告,只需把闭包提前绑定到临时变量,在循环里复用这些变量即可。修改后的宏代码如下:
macro_rules! printit { ($range:expr, $($func:expr),* $(,)?) => {{ // 提前绑定所有闭包到临时变量,避免循环内重复创建 $(let f = $func;)* for x in $range { $(println!("{:?} {:?}", x, f(x));)* } }}; } fn main() { printit!( 0..10, |x: u64| x.trailing_zeros(), |x: u64| x.leading_zeros(), |x: u64| x.count_ones() ); }
修改说明
- 在循环外部,先把每个传入的
$func闭包赋值给独立的临时变量f(宏会为每个闭包生成单独的let f = ...;语句) - 循环内部调用的是提前绑定好的
f(x),而不是直接在表达式里创建并调用闭包
这样每个闭包只会被初始化一次,循环过程中复用同一个实例,既符合Clippy的规范要求,也避免了不必要的闭包重复创建。
内容的提问来源于stack exchange,提问作者user22608671
相关产品推荐
相关产品推荐

