diff --git a/src/libcore/option.rs b/src/libcore/option.rs index c98a2d124854b..77fe55aadee48 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -145,10 +145,11 @@ use cmp::{PartialEq, Eq, Ord}; use default::Default; -use slice::Slice; use iter::{Iterator, DoubleEndedIterator, FromIterator, ExactSize}; use mem; +use result::{Result, Ok, Err}; use slice; +use slice::Slice; // Note that this is not a lang item per se, but it has a hidden dependency on // `Iterator`, which is one. The compiler assumes that the `next` method of @@ -439,6 +440,48 @@ impl Option { match self { None => def(), Some(t) => f(t) } } + /// Transforms the `Option` into a `Result`, mapping `Some(v)` to + /// `Ok(v)` and `None` to `Err(err)`. + /// + /// # Example + /// + /// ``` + /// let x = Some("foo"); + /// assert_eq!(x.ok_or(0i), Ok("foo")); + /// + /// let x: Option<&str> = None; + /// assert_eq!(x.ok_or(0i), Err(0i)); + /// ``` + #[inline] + #[experimental] + pub fn ok_or(self, err: E) -> Result { + match self { + Some(v) => Ok(v), + None => Err(err), + } + } + + /// Transforms the `Option` into a `Result`, mapping `Some(v)` to + /// `Ok(v)` and `None` to `Err(err())`. + /// + /// # Example + /// + /// ``` + /// let x = Some("foo"); + /// assert_eq!(x.ok_or_else(|| 0i), Ok("foo")); + /// + /// let x: Option<&str> = None; + /// assert_eq!(x.ok_or_else(|| 0i), Err(0i)); + /// ``` + #[inline] + #[experimental] + pub fn ok_or_else(self, err: || -> E) -> Result { + match self { + Some(v) => Ok(v), + None => Err(err()), + } + } + /// Deprecated. /// /// Applies a function to the contained value or does nothing.