Function std::mem::replace
[−]
[src]
pub fn replace<T>(dest: &mut T, src: T) -> T
Replaces the value at a mutable location with a new one, returning the old value, without deinitializing or copying either one.
This is primarily used for transferring and swapping ownership of a value in a mutable location.
Examples
A simple example:
fn main() { use std::mem; let mut v: Vec<i32> = Vec::new(); mem::replace(&mut v, Vec::new()); }use std::mem; let mut v: Vec<i32> = Vec::new(); mem::replace(&mut v, Vec::new());
This function allows consumption of one field of a struct by replacing it with another value. The normal approach doesn't always work:
fn main() { struct Buffer<T> { buf: Vec<T> } impl<T> Buffer<T> { fn get_and_reset(&mut self) -> Vec<T> { // error: cannot move out of dereference of `&mut`-pointer let buf = self.buf; self.buf = Vec::new(); buf } } }struct Buffer<T> { buf: Vec<T> } impl<T> Buffer<T> { fn get_and_reset(&mut self) -> Vec<T> { // error: cannot move out of dereference of `&mut`-pointer let buf = self.buf; self.buf = Vec::new(); buf } }
Note that T
does not necessarily implement Clone
, so it can't even clone and reset
self.buf
. But replace
can be used to disassociate the original value of self.buf
from
self
, allowing it to be returned:
use std::mem; impl<T> Buffer<T> { fn get_and_reset(&mut self) -> Vec<T> { mem::replace(&mut self.buf, Vec::new()) } }