In the second edition of The Rust Programming Language (emphasis mine):
Function pointers implement all three of the closure traits (
Fn
,FnMut
, andFnOnce
), so you can always pass a function pointer as an argument for a function that expects a closure. It’s best to write functions using a generic type and one of the closure traits so your functions can accept either functions or closures.
Passing a closure to a function which accepts a function pointer as an argument doesn't compile:
fn main() {
let a = String::from("abc");
let x = || println!("{}", a);
fn wrap(c: fn() -> ()) -> () {
c()
}
wrap(x);
}
error[E0308]: mismatched types
--> src/main.rs:10:10
|
10 | wrap(x);
| ^ expected fn pointer, found closure
|
= note: expected type `fn()`
found type `[closure@src/main.rs:4:13: 4:33 a:_]`
Why does this not work?