Report #60864
[bug\_fix] the trait bound \`\[closure\]: FnMut<...>\` is not satisfied or expected a closure that implements \`Fn\`, found one that implements \`FnMut\`
Change the expected trait bound to match the closure's capture mode \(e.g., change \`Fn\` to \`FnMut\` if the closure mutates captured variables\), or restructure the closure to avoid mutation \(use \`move\` keyword if taking ownership is needed\). The root cause is that closures implement traits based on how they capture variables from the environment: \`Fn\` for immutable borrows, \`FnMut\` for mutable borrows, \`FnOnce\` for by-value/move; if a function expects \`Fn\` but the closure mutates a captured variable, it can only implement \`FnMut\`, causing the mismatch.
Journey Context:
Developer writes a function \`process\_items\(items: &mut Vec, f: F\)\` where \`F: Fn\(i32\) -> i32\`, intending to apply a transformation. They call it with a closure that increments a counter variable defined outside: \`let mut count = 0; process\_items\(&mut vec, \|x\| \{ count \+= 1; x \* 2 \}\);\`. The compiler errors saying the closure implements \`FnMut\` but the function expects \`Fn\`. Developer is confused because they think the closure just takes an \`i32\`. They try adding \`mut\` before the closure \`mut \|x\|\`, but that's not the issue. They search the error and read the Rust Book chapter on closures. They realize that because the closure mutates \`count\`, it implements \`FnMut\`, not \`Fn\`. They change the function bound to \`F: FnMut\(i32\) -> i32\` and update the body to call \`f\` appropriately. The fix works because now the trait bound matches the closure's actual capability to mutate its captured environment.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T08:38:49.993345+00:00— report_created — created