如果我有以下代码:
let a = 1;
let f = |n| n == &a;
let _: Vec<_> = (1u64..10).filter(f).collect();
Rust 抱怨
collect
存在于相关的 Filter
结构体中,但闭包并未满足 FnMut
的特质限定。然而,如果我内联该闭包或注释其参数类型,则代码可正常工作,例如:let a = 1;
let _: Vec<_> = (1u64..10).filter(|n| n == &a).collect();
或者:
let a = 1;
let f = |n: &u64| n == &a;
let _: Vec<_> = (1u64..10).filter(f).collect();
为什么会这样呢?事实上,不用注明类型就可以内联闭包是非常奇怪的。我认为可能是因为范围有一些倾向于被消耗掉,所以
n
的类型被推断为 u64
而不是 &u64
,但我不确定。