Report #15321
[bug\_fix] expected a closure that implements \`Fn\`, but this closure only implements \`FnMut\`
Use interior mutability \(\`RefCell\` for single-threaded, \`Mutex\` for multi-threaded\) to mutate captured state while satisfying the \`Fn\` trait, which requires an immutable borrow of the closure itself. Alternatively, use \`FnMut\` or \`FnOnce\` in the type signature if the API permits \(e.g., \`Box\`\), or clone the data so each closure invocation owns its copy.
Journey Context:
A developer is implementing a callback system, storing closures in a \`Vec>\`. The closure needs to update a counter in the outer scope: \`let mut count = 0; callbacks.push\(Box::new\(\|\| count \+= 1\)\);\`. The compiler rejects this because \`Fn\` closures cannot mutate their captured environment. The developer tries changing the type to \`Box\`, but then the \`Vec\` itself becomes problematic because calling \`FnMut\` requires \`&mut self\`, which doesn't work well with shared ownership in a \`Vec\` without careful management. They realize they need to use \`RefCell\` to allow runtime-checked borrowing: \`let count = RefCell::new\(0\); ... move \|\| \*count.borrow\_mut\(\) \+= 1\`, which works because the closure itself is \`Fn\` \(immutable borrow of the \`RefCell\` handle\), while the interior mutability handles the state change.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T23:46:58.374276+00:00— report_created — created