How to change the variable from inside Fn closure in Rust?

Change your perform_for_all function to use FnMut instead of Fn:

fn perform_for_all<F>(&mut self, mut f: F)
where
    F: FnMut(&mut u64),
{
    for mut i in &mut self.vec {
        f(&mut i);
    }
}

As Peter said, there is some compiler magic going on.

The signature for Fn::call is:

extern "rust-call" fn call(&self, args: Args) -> Self::Output

This takes an immutable reference to self, which is why you can't modify any of the captured variables.

The signature for FnMut::call_mut lets you mutate variables because it takes &mut self:

extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output

By changing your closure from Fn to FnMut, you allow it to modify its captured variables, given that the references you pass to it are mutable.


Just to expand a little on SplittyDev's answer.

When you use a closure, the compiler does some magic to let the closure access variables in its environment. Effectively it will create a new struct, whose members are the variables that you tried to access.

It's not exactly this (which won't actually compile), but it's a reasonable approximation conceptually:

struct Closure_1 {
    done: bool
}

impl FnMut<&mut u64> for Closure_1 {
    fn call_mut(&mut self, v: &mut u64) {
        println!("value: {:?}", v);                                                                 
        self.done = true;         
    }
} 

And when you call it, those variables will be borrowed or copied (or moved if you use move keyword).

let mut c1 = Closure_1 { done : done };
a.perform_for_all(|v| c1.call(&v)); 
done = c1.done;

When the closure modifies its environment, it cannot be a Fn because it must also mutate the variables on itself:

impl Fn<&mut u64> for Closure_1 {
    fn call(&self, v: &mut u64) {
        println!("value: {:?}", v);                                                                 
        self.done = true; // Can't do this because self is not a mutable ref
    }
}

See The Rust Programming Language section on closures and their environment for more information.