about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/result.rs38
-rw-r--r--src/libcoretest/lib.rs1
-rw-r--r--src/libcoretest/result.rs6
3 files changed, 45 insertions, 0 deletions
diff --git a/src/libcore/result.rs b/src/libcore/result.rs
index 9cb42124e00..3d34f620067 100644
--- a/src/libcore/result.rs
+++ b/src/libcore/result.rs
@@ -792,6 +792,44 @@ impl<T: fmt::Debug, E> Result<T, E> {
     }
 }
 
+impl<T: Default, E> Result<T, E> {
+    /// Returns the contained value or a default
+    ///
+    /// Consumes the `self` argument then, if `Ok`, returns the contained
+    /// value, otherwise if `Err`, returns the default value for that
+    /// type.
+    ///
+    /// # Examples
+    ///
+    /// Convert a string to an integer, turning poorly-formed strings
+    /// into 0 (the default value for integers). [`parse`] converts
+    /// a string to any other type that implements [`FromStr`], returning an
+    /// `Err` on error.
+    ///
+    /// ```
+    /// #![feature(result_unwrap_or_default)]
+    ///
+    /// let good_year_from_input = "1909";
+    /// let bad_year_from_input = "190blarg";
+    /// let good_year = good_year_from_input.parse().unwrap_or_default();
+    /// let bad_year = bad_year_from_input.parse().unwrap_or_default();
+    ///
+    /// assert_eq!(1909, good_year);
+    /// assert_eq!(0, bad_year);
+    ///
+    /// [`parse`]: ../../std/primitive.str.html#method.parse
+    /// [`FromStr`]: ../../std/str/trait.FromStr.html
+    /// ```
+    #[inline]
+    #[unstable(feature = "result_unwrap_or_default", issue = "0")]
+    pub fn unwrap_or_default(self) -> T {
+        match self {
+            Ok(x) => x,
+            Err(_) => Default::default(),
+        }
+    }
+}
+
 // This is a separate function to reduce the code size of the methods
 #[inline(never)]
 #[cold]
diff --git a/src/libcoretest/lib.rs b/src/libcoretest/lib.rs
index 590bf478aa7..cdbc2147318 100644
--- a/src/libcoretest/lib.rs
+++ b/src/libcoretest/lib.rs
@@ -34,6 +34,7 @@
 #![feature(unique)]
 #![feature(iter_max_by)]
 #![feature(iter_min_by)]
+#![feature(result_unwrap_or_default)]
 
 extern crate core;
 extern crate test;
diff --git a/src/libcoretest/result.rs b/src/libcoretest/result.rs
index 6e9f653dcd8..bc2cd8bbfc6 100644
--- a/src/libcoretest/result.rs
+++ b/src/libcoretest/result.rs
@@ -183,3 +183,9 @@ pub fn test_iter_mut() {
     }
     assert_eq!(err, Err("error"));
 }
+
+#[test]
+pub fn test_unwrap_or_default() {
+    assert_eq!(op1().unwrap_or_default(), 666);
+    assert_eq!(op2().unwrap_or_default(), 0);
+}