try_trait
The tracking issue for this feature is: #42327
This introduces a new trait Try
for extending the ?
operator to types
other than Result
(a part of RFC 1859). The trait provides the canonical
way to view a type in terms of a success/failure dichotomy. This will
allow ?
to supplant the try_opt!
macro on Option
and the try_ready!
macro on Poll
, among other things.
Here's an example implementation of the trait:
/// A distinct type to represent the `None` value of an `Option`.
///
/// This enables using the `?` operator on `Option`; it's rarely useful alone.
#[derive(Debug)]
#[unstable(feature = "try_trait", issue = "42327")]
pub struct None { _priv: () }
#[unstable(feature = "try_trait", issue = "42327")]
impl<T> ops::Try for Option<T> {
type Ok = T;
type Error = None;
fn into_result(self) -> Result<T, None> {
self.ok_or(None { _priv: () })
}
fn from_ok(v: T) -> Self {
Some(v)
}
fn from_error(_: None) -> Self {
None
}
}
Note the Error
associated type here is a new marker. The ?
operator
allows interconversion between different Try
implementers only when
the error type can be converted Into
the error type of the enclosing
function (or catch block). Having a distinct error type (as opposed to
just ()
, or similar) restricts this to where it's semantically meaningful.