fn is a function pointer type — concrete, no captures, zero-cost. Fn is a trait — abstraction, captures, generic. fn = type, Fn = trait.
fn — function pointer:
fn(Args) -> Output.1fn is_even(x: i32) -> bool { x % 2 == 0 }2fn is_positive(x: i32) -> bool { x > 0 }34let predicates: Vec<fn(i32) -> bool> = vec![is_even, is_positive];5let numbers = vec![-3, -2, 0, 1, 2, 3];67for pred in &predicates {8 let matches: Vec<_> = numbers.iter().filter(|&&x| pred(x)).collect();9 println!("{:?} -> {:?}", pred, matches);10}
Fn — closure trait:
1let base = 10;2let add_base = |x| x + base; // Fn3println!("{}", add_base(5)); // 1545fn transform<F: Fn(i32) -> i32>(items: Vec<i32>, f: F) -> Vec<i32> {6 items.into_iter().map(f).collect()7}89let result = transform(vec![1, 2, 3], |x| x * x);10println!("{:?}", result); // [1, 4, 9]
When to use fn:
When to use Fn/FnMut/FnOnce:
Common mistakes: