A closure was used but didn't implement the expected trait.
Erroneous code example:
struct X; fn foo<T>(_: T) {} fn bar<T: Fn(u32)>(_: T) {} fn main() { let x = X; let closure = |_| foo(x); // error: expected a closure that implements // the `Fn` trait, but this closure only // implements `FnOnce` bar(closure); }
In the example above, closure
is an FnOnce
closure whereas the bar
function expected an Fn
closure. In this case, it‘s simple to fix the issue, you just have to implement Copy
and Clone
traits on struct X
and it’ll be ok:
#[derive(Clone, Copy)] // We implement `Clone` and `Copy` traits. struct X; fn foo<T>(_: T) {} fn bar<T: Fn(u32)>(_: T) {} fn main() { let x = X; let closure = |_| foo(x); bar(closure); // ok! }
To understand better how closures work in Rust, read: https://doc.rust-lang.org/book/ch13-01-closures.html