about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPascal Hertleif <killercup@gmail.com>2018-11-29 14:12:40 +0100
committerPascal Hertleif <killercup@gmail.com>2018-12-23 15:41:49 +0100
commit2c0f011ca28dbe2941369315bd78a1dbbb7f950e (patch)
tree21c55f75d0cae68bbe77d05e278b54f94da3b857
parentddab10a692aab2e2984b5c826ed9d78a57e94851 (diff)
downloadrust-2c0f011ca28dbe2941369315bd78a1dbbb7f950e.tar.gz
rust-2c0f011ca28dbe2941369315bd78a1dbbb7f950e.zip
Improve docs for collecting into `Option`s
Changes the original example to use more idiomatic formatting as well
as `.checked_add`. Also adds a second example to show a case where the
`.collect` returns `None`.
-rw-r--r--src/libcore/option.rs40
1 files changed, 31 insertions, 9 deletions
diff --git a/src/libcore/option.rs b/src/libcore/option.rs
index 44d632ece05..dbad29229eb 100644
--- a/src/libcore/option.rs
+++ b/src/libcore/option.rs
@@ -1253,20 +1253,42 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
     /// returned. Should no [`None`][Option::None] occur, a container with the
     /// values of each [`Option`] is returned.
     ///
-    /// Here is an example which increments every integer in a vector,
-    /// checking for overflow:
+    /// # Examples
+    ///
+    /// Here is an example which increments every integer in a vector.
+    /// `We use the checked variant of `add` that returns `None` when the
+    /// calculation would result in an overflow.
     ///
     /// ```
-    /// use std::u16;
+    /// let items = vec![0_u16, 1, 2];
+    ///
+    /// let res: Option<Vec<u16>> = items
+    ///     .iter()
+    ///     .map(|x| x.checked_add(1))
+    ///     .collect();
     ///
-    /// let v = vec![1, 2];
-    /// let res: Option<Vec<u16>> = v.iter().map(|&x: &u16|
-    ///     if x == u16::MAX { None }
-    ///     else { Some(x + 1) }
-    /// ).collect();
-    /// assert!(res == Some(vec![2, 3]));
+    /// assert_eq!(res, Some(vec![1, 2, 3]));
     /// ```
     ///
+    /// As you can see, this will return the expected, valid items.
+    ///
+    /// Here is another example that tries to subtract one from another list
+    /// of integers, this time checking for underflow:
+    ///
+    /// ```
+    /// let items = vec![2_u16, 1, 0];
+    ///
+    /// let res: Option<Vec<u16>> = items
+    ///     .iter()
+    ///     .map(|x| x.checked_sub(1))
+    ///     .collect();
+    ///
+    /// assert_eq!(res, None);
+    /// ```
+    ///
+    /// Since the last element is zero, it would underflow. Thus, the resulting
+    /// value is `None`.
+    ///
     /// [`Iterator`]: ../iter/trait.Iterator.html
     #[inline]
     fn from_iter<I: IntoIterator<Item=Option<A>>>(iter: I) -> Option<V> {