about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKang Seonghoon <public+git@mearie.org>2014-04-27 22:37:11 +0900
committerKang Seonghoon <public+git@mearie.org>2014-04-28 22:28:47 +0900
commit1be93e61da4cd63840a0b5318785547a009e8cae (patch)
tree29cc2c9ca57faf7adb4cd538fdd17e89549f4dd1
parenteea4909a8713a54b3c47e871a70baf6c722999a3 (diff)
downloadrust-1be93e61da4cd63840a0b5318785547a009e8cae.tar.gz
rust-1be93e61da4cd63840a0b5318785547a009e8cae.zip
std: Add more docs to `std::mem::replace`.
-rw-r--r--src/libstd/mem.rs32
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 {