Function replace_with

Source
pub fn replace_with<T, D: FnOnce() -> T, F: FnOnce(T) -> T>(
    dest: &mut T,
    default: D,
    f: F,
)
Expand description

Temporarily takes ownership of a value at a mutable location, and replace it with a new value based on the old one.

We move out of the reference temporarily, to apply a closure f, returning a new value, which is then placed at the original value’s location.

§An important note

On panic (or to be more precise, unwinding) of the closure f, default will be called to provide a replacement value. default should not panic – doing so will abort the process.

§Example

enum States {
    A(String),
    B(String),
}

impl States {
    fn poll(&mut self) {
        replace_with(
            self,
            || States::A(String::new()),
            |self_| match self_ {
                States::A(a) => States::B(a),
                States::B(a) => States::A(a),
            },
        );
    }
}