diff options
| author | Kang Seonghoon <public+git@mearie.org> | 2014-04-27 22:37:11 +0900 |
|---|---|---|
| committer | Kang Seonghoon <public+git@mearie.org> | 2014-04-28 22:28:47 +0900 |
| commit | 1be93e61da4cd63840a0b5318785547a009e8cae (patch) | |
| tree | 29cc2c9ca57faf7adb4cd538fdd17e89549f4dd1 | |
| parent | eea4909a8713a54b3c47e871a70baf6c722999a3 (diff) | |
| download | rust-1be93e61da4cd63840a0b5318785547a009e8cae.tar.gz rust-1be93e61da4cd63840a0b5318785547a009e8cae.zip | |
std: Add more docs to `std::mem::replace`.
| -rw-r--r-- | src/libstd/mem.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/libstd/mem.rs b/src/libstd/mem.rs index 342e565572b..d216d91b901 100644 --- a/src/libstd/mem.rs +++ b/src/libstd/mem.rs @@ -248,6 +248,38 @@ pub fn swap<T>(x: &mut T, y: &mut T) { /** * Replace 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. For example, this function allows consumption of + * one field of a struct by replacing it with another value. The normal approach + * doesn't always work: + * + * ```rust,ignore + * 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: + * + * ```rust + * # struct Buffer<T> { buf: Vec<T> } + * impl<T> Buffer<T> { + * fn get_and_reset(&mut self) -> Vec<T> { + * use std::mem::replace; + * replace(&mut self.buf, Vec::new()) + * } + * } + * ``` */ #[inline] pub fn replace<T>(dest: &mut T, mut src: T) -> T { |
