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 parse_int(s: &str) -> Result<i32, std::num::ParseIntError> {2 s.parse()3}45let parser: fn(&str) -> Result<i32, _> = parse_int;6println!("{:?}", parser("42")); // Ok(42)78// Store in struct9struct Rule {10 name: String,11 check: fn(&str) -> bool,12}1314let rules = vec![15 Rule { name: "non-empty".into(), check: |s| !s.is_empty() },16 Rule { name: "numeric".into(), check: |s| s.chars().all(|c| c.is_numeric()) },17];
Fn — closure trait:
1let min_len = 3;2let validator = |s: &str| s.len() >= min_len; // Fn34fn validate_all<F: Fn(&str) -> bool>(items: &[&str], rule: F) -> Vec<&str> {5 items.iter().filter(|&&s| rule(s)).copied().collect()6}78let words = vec!["hi", "hello", "hey", "world"];9let long_words = validate_all(&words, validator);10println!("{:?}", long_words); // ["hello", "world"]
When to use fn:
When to use Fn/FnMut/FnOnce:
Common mistakes: