Function core::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 deinitialising 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`Tdoes not necessarily implement` does not necessarily implement Clone`Clone, so it can't even clone and reset`, so it can't even clone and reset self.buf`self.buf. But`. But replace`replacecan be used to disassociate the original value of` can be used to disassociate the original value of self.buf`self.buffrom` from self`self`, allowing it to be returned:

fn main() { use std::mem; struct Buffer<T> { buf: Vec<T> } impl<T> Buffer<T> { fn get_and_reset(&mut self) -> Vec<T> { mem::replace(&mut self.buf, Vec::new()) } } }
use std::mem;
impl<T> Buffer<T> {
    fn get_and_reset(&mut self) -> Vec<T> {
        mem::replace(&mut self.buf, Vec::new())
    }
}