Function replace_with::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 constitute a double panic and will most likely 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),
			},
		);
	}
}