Rust errors / Types and traits
Rust compiler error · checked with rustc 1.99.0
Rust error E0525: expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce`
What it meansA closure was used but didn't implement the expected trait.
What rustc prints
error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce` --> main.rs:8:19 | 8 | let closure = |_| foo(x); // error: expected a closure that implements | ^^^ - closure is `FnOnce` because it moves the variable `x` out of its environment | | | this closure implements `FnOnce`, not `Fn` ... 11 | bar(closure); | --- ------- the requirement to implement `Fn` derives from here | | | required by a bound introduced by this call | note: required by a bound in `bar` --> main.rs:4:11 | 4 | fn bar<T: Fn(u32)>(_: T) {} | ^^^^^^^ required by this bound in `bar`
Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
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.
From rustc --explain E0525 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0308mismatched types
- E0277the trait bound is not satisfied
- E0599no method named X found in the current scope
- E0433failed to resolve
- E0512cannot transmute between types of different sizes, or dependently-sized types
- E0520`fly` specializes an item from a parent `impl`, but that item is not marked `default`
- E0529expected an array or slice, found `f32`
- E0531cannot find tuple struct or tuple variant `Type` in this scope
Up next
Often hit nextE0308: mismatched typesA related error from the same family.Read it next →Did this answer your question?