Rollup merge of #22817 - jmesmon:result-or-type, r=huonw

Changes .or() so that it can return a Result with a different E type
than the one it is called on.

Essentially:

    fn or(self, res: Result<T, E>) -> Result<T, E>

becomes

    fn or<F>(self, res: Result<T, F>) -> Result<T, F>

This brings `or` in line with the existing `and` & `or_else`

This is a
[breaking-change]
Due to some code needing additional type annotations.
This commit is contained in:
Manish Goregaokar 2015-02-27 11:44:19 +05:30
commit ce5f1b3216
2 changed files with 4 additions and 4 deletions

View file

@ -641,9 +641,9 @@ pub fn and_then<U, F: FnOnce(T) -> Result<U, E>>(self, op: F) -> Result<U, E> {
/// ```
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn or(self, res: Result<T, E>) -> Result<T, E> {
pub fn or<F>(self, res: Result<T, F>) -> Result<T, F> {
match self {
Ok(_) => self,
Ok(v) => Ok(v),
Err(_) => res,
}
}

View file

@ -36,10 +36,10 @@ pub fn test_and_then() {
#[test]
pub fn test_or() {
assert_eq!(op1().or(Ok(667)).unwrap(), 666);
assert_eq!(op1().or(Ok::<_, &'static str>(667)).unwrap(), 666);
assert_eq!(op1().or(Err("bad")).unwrap(), 666);
assert_eq!(op2().or(Ok(667)).unwrap(), 667);
assert_eq!(op2().or(Ok::<_, &'static str>(667)).unwrap(), 667);
assert_eq!(op2().or(Err("bad")).unwrap_err(), "bad");
}