diff options
| author | bors <bors@rust-lang.org> | 2017-06-01 05:24:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-06-01 05:24:11 +0000 |
| commit | 38efb2e1ccf210b0108d2b88ee9d4ddcd8e91a3a (patch) | |
| tree | fd62a4e7688baa1ef79d4d4ac559f487d64903e4 /src/libcore | |
| parent | e0cc22b4bae8007c59fbe58f2c104ecd743d746a (diff) | |
| parent | 9bd6dc73fc7fd46bf83ff17bea13a410efb1fc96 (diff) | |
| download | rust-38efb2e1ccf210b0108d2b88ee9d4ddcd8e91a3a.tar.gz rust-38efb2e1ccf210b0108d2b88ee9d4ddcd8e91a3a.zip | |
Auto merge of #42348 - frewsxcv:rollup, r=frewsxcv
Rollup of 9 pull requests - Successful merges: #42136, #42275, #42286, #42297, #42302, #42306, #42314, #42324, #42347 - Failed merges:
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/ops.rs | 65 | ||||
| -rw-r--r-- | src/libcore/result.rs | 19 |
2 files changed, 67 insertions, 17 deletions
diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index c76cff4dc34..a1de8fe76e2 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -2918,15 +2918,9 @@ pub trait BoxPlace<Data: ?Sized> : Place<Data> { fn make_place() -> Self; } -/// A trait for types which have success and error states and are meant to work -/// with the question mark operator. -/// When the `?` operator is used with a value, whether the value is in the -/// success or error state is determined by calling `translate`. -/// -/// This trait is **very** experimental, it will probably be iterated on heavily -/// before it is stabilised. Implementors should expect change. Users of `?` -/// should not rely on any implementations of `Carrier` other than `Result`, -/// i.e., you should not expect `?` to continue to work with `Option`, etc. +/// This trait has been superseded by the `Try` trait, but must remain +/// here as `?` is still lowered to it in stage0 . +#[cfg(stage0)] #[unstable(feature = "question_mark_carrier", issue = "31436")] pub trait Carrier { /// The type of the value when computation succeeds. @@ -2945,6 +2939,7 @@ pub trait Carrier { fn translate<T>(self) -> T where T: Carrier<Success=Self::Success, Error=Self::Error>; } +#[cfg(stage0)] #[unstable(feature = "question_mark_carrier", issue = "31436")] impl<U, V> Carrier for Result<U, V> { type Success = U; @@ -2970,21 +2965,57 @@ impl<U, V> Carrier for Result<U, V> { struct _DummyErrorType; -impl Carrier for _DummyErrorType { - type Success = (); +impl Try for _DummyErrorType { + type Ok = (); type Error = (); - fn from_success(_: ()) -> _DummyErrorType { + fn into_result(self) -> Result<Self::Ok, Self::Error> { + Ok(()) + } + + fn from_ok(_: ()) -> _DummyErrorType { _DummyErrorType } fn from_error(_: ()) -> _DummyErrorType { _DummyErrorType } +} - fn translate<T>(self) -> T - where T: Carrier<Success=(), Error=()> - { - T::from_success(()) - } +/// A trait for customizing the behaviour of the `?` operator. +/// +/// A type implementing `Try` is one that has a canonical way to view it +/// in terms of a success/failure dichotomy. This trait allows both +/// extracting those success or failure values from an existing instance and +/// creating a new instance from a success or failure value. +#[unstable(feature = "try_trait", issue = "42327")] +pub trait Try { + /// The type of this value when viewed as successful. + #[unstable(feature = "try_trait", issue = "42327")] + type Ok; + /// The type of this value when viewed as failed. + #[unstable(feature = "try_trait", issue = "42327")] + type Error; + + /// Applies the "?" operator. A return of `Ok(t)` means that the + /// execution should continue normally, and the result of `?` is the + /// value `t`. A return of `Err(e)` means that execution should branch + /// to the innermost enclosing `catch`, or return from the function. + /// + /// If an `Err(e)` result is returned, the value `e` will be "wrapped" + /// in the return type of the enclosing scope (which must itself implement + /// `Try`). Specifically, the value `X::from_error(From::from(e))` + /// is returned, where `X` is the return type of the enclosing function. + #[unstable(feature = "try_trait", issue = "42327")] + fn into_result(self) -> Result<Self::Ok, Self::Error>; + + /// Wrap an error value to construct the composite result. For example, + /// `Result::Err(x)` and `Result::from_error(x)` are equivalent. + #[unstable(feature = "try_trait", issue = "42327")] + fn from_error(v: Self::Error) -> Self; + + /// Wrap an OK value to construct the composite result. For example, + /// `Result::Ok(x)` and `Result::from_ok(x)` are equivalent. + #[unstable(feature = "try_trait", issue = "42327")] + fn from_ok(v: Self::Ok) -> Self; } diff --git a/src/libcore/result.rs b/src/libcore/result.rs index c46b0c1324d..df7fff0df92 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -242,6 +242,7 @@ use fmt; use iter::{FromIterator, FusedIterator, TrustedLen}; +use ops; /// `Result` is a type that represents either success (`Ok`) or failure (`Err`). /// @@ -1108,3 +1109,21 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> { } } } + +#[unstable(feature = "try_trait", issue = "42327")] +impl<T,E> ops::Try for Result<T, E> { + type Ok = T; + type Error = E; + + fn into_result(self) -> Self { + self + } + + fn from_ok(v: T) -> Self { + Ok(v) + } + + fn from_error(v: E) -> Self { + Err(v) + } +} \ No newline at end of file |
