1.0.0[−][src]Function nom::lib::std::mem::replace
pub fn replace<T>(dest: &mut T, src: T) -> T
Moves src
into the referenced dest
, returning the previous dest
value.
Neither value is dropped.
Examples
A simple example:
use std::mem; let mut v: Vec<i32> = vec![1, 2]; let old_v = mem::replace(&mut v, vec![3, 4, 5]); assert_eq!(2, old_v.len()); assert_eq!(3, v.len());
replace
allows consumption of a struct field by replacing it with another value.
Without replace
you can run into issues like these:
ⓘThis example deliberately fails to compile
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()) } }