Rust sometimes needs manual type annotation
(Jin Qing’s Column, Apr., 2022)
This code compiles error:
trait MyCallback: FnMut(&u32) -> () { }
impl<F: FnMut(&u32) -> ()> MyCallback for F { }
fn process_data(mut f: impl MyCallback) -> () {
f(&0)
}
fn process_data_2(mut f: impl FnMut(&u32) -> ()) -> () {
f(&0)
}
fn main() {
// Doesn't compile
process_data(|_| ());
// Compiles
process_data_2(|_| ());
}
expected type `for<'r> FnMut<(&'r u32,)>`
found type `FnMut<(&u32,)>`
Fix:
process_data(|_: &_| ());
See: https://stackoverflow.com/questions/61671460/rust-type-mismatch-resolving-forr-with-closure-trait-alias-argument
Also see: https://github.com/rust-lang/rust/issues/58639
Sometimes, Rust needs a type annotation in closure.