Error code E0525
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 better understand how these work in Rust, read the Closures chapter of the Book.