diff options
| author | bors <bors@rust-lang.org> | 2014-09-27 04:02:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-27 04:02:58 +0000 |
| commit | 606bf110bc1a5b2eaeacf1d3ae7d9a3ab8d9b78e (patch) | |
| tree | b36d826d0e46289a92cba4065bb905568917d203 /src | |
| parent | 43d7d7c15e964c1cb506cbce90bb4b32b57281b8 (diff) | |
| parent | 0c8878d04258564b1866654a9866c5fbf2df6b68 (diff) | |
| download | rust-606bf110bc1a5b2eaeacf1d3ae7d9a3ab8d9b78e.tar.gz rust-606bf110bc1a5b2eaeacf1d3ae7d9a3ab8d9b78e.zip | |
auto merge of #17469 : sfackler/rust/into-result, r=aturon
This is the inverse of `Result::ok` and helps to bridge `Option` and `Result` based APIs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/option.rs | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/libcore/option.rs b/src/libcore/option.rs index c98a2d12485..77fe55aadee 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<T> Option<T> { match self { None => def(), Some(t) => f(t) } } + /// Transforms the `Option<T>` into a `Result<T, E>`, 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<E>(self, err: E) -> Result<T, E> { + match self { + Some(v) => Ok(v), + None => Err(err), + } + } + + /// Transforms the `Option<T>` into a `Result<T, E>`, 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<E>(self, err: || -> E) -> Result<T, E> { + match self { + Some(v) => Ok(v), + None => Err(err()), + } + } + /// Deprecated. /// /// Applies a function to the contained value or does nothing. |
