fn is a function pointer type — concrete, no captures, zero-cost. Fn is a trait — abstraction over callables, supports captures, generic. fn is a type; Fn is a trait.
fn — function pointer:
fn(Args) -> Output.1fn negate(x: i32) -> i32 { -x }23let f: fn(i32) -> i32 = negate;4println!("{}", f(5)); // -556// In a struct7struct MathOp {8 name: String,9 func: fn(f64) -> f64,10}1112let ops = vec![13 MathOp { name: "sqrt".into(), func: f64::sqrt },14 MathOp { name: "abs".into(), func: f64::abs },15];
Fn — closure trait:
1let threshold = 100;2let is_large = |x: i32| x > threshold; // Fn3println!("{}", is_large(50)); // false4println!("{}", is_large(150)); // true56fn filter<F: Fn(&i32) -> bool>(items: &[i32], predicate: F) -> Vec<&i32> {7 items.iter().filter(|x| predicate(x)).collect()8}910let data = vec![10, 50, 150, 200, 75];11let large = filter(&data, &is_large);12println!("{:?}", large); // [150, 200]
When to use fn:
When to use Fn/FnMut/FnOnce:
Common mistakes: