fn (lowercase) is a concrete function pointer type. Fn (uppercase) is a trait that closures and functions implement — it's an abstraction over anything callable.
fn — function pointer:
fn(i32) -> i32.1fn double(x: i32) -> i32 {2 x * 23}45let f: fn(i32) -> i32 = double;6println!("{}", f(5)); // 1078// Function pointer in a struct9struct Callback {10 handler: fn(i32) -> i32,11}1213let cb = Callback { handler: double };14println!("{}", (cb.handler)(10)); // 20
Fn — closure trait:
1let multiplier = 3;2let multiply = |x| x * multiplier; // implements Fn3println!("{}", multiply(7)); // 2145// Generic function accepting Fn6fn map_vec<F: Fn(i32) -> i32>(vec: &[i32], f: F) -> Vec<i32> {7 vec.iter().map(|&x| f(x)).collect()8}910let nums = vec![1, 2, 3, 4, 5];11let doubled = map_vec(&nums, |x| x * 2);12println!("{:?}", doubled); // [2, 4, 6, 8, 10]
When to use fn:
When to use Fn/FnMut/FnOnce:
Common mistakes: