-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lower ?
to Try
instead of Carrier
#42275
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# `try_trait` | ||
|
||
The tracking issue for this feature is: [#31436] | ||
|
||
[#31436]: https://github.com/rust-lang/rust/issues/31436 | ||
|
||
------------------------ |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 = "31436")] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. so I also re-used #31436 as the tracking issue, but I wonder if we should make a new issue just for this feature? It would seem to make things a bit clearer e.g. when we call for FCP... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @nikomatsakis As policy I tend to favor making tracking issues as fine-grained as possible, specifically because of the nightmare that the original There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Created #42327 and updated the attributes. |
||
pub trait Try { | ||
/// The type of this value when viewed as successful. | ||
#[unstable(feature = "try_trait", issue = "31436")] | ||
type Ok; | ||
/// The type of this value when viewed as failed. | ||
#[unstable(feature = "try_trait", issue = "31436")] | ||
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 = "31436")] | ||
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 = "31436")] | ||
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 = "31436")] | ||
fn from_ok(v: Self::Ok) -> Self; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we say a bit more here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a bit more unstable-book text. I'm uncertain exactly what's supposed to be in it; is there anything in particular you'd like me to address there?