2014-01-25 01:37:51 -06:00
|
|
|
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
2012-12-03 18:48:01 -06:00
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2014-04-12 18:33:21 -05:00
|
|
|
//! Error handling with the `Result` type
|
|
|
|
//!
|
2014-07-04 08:23:17 -05:00
|
|
|
//! `Result<T, E>` is the type used for returning and propagating
|
2014-04-12 18:33:21 -05:00
|
|
|
//! errors. It is an enum with the variants, `Ok(T)`, representing
|
|
|
|
//! success and containing a value, and `Err(E)`, representing error
|
|
|
|
//! and containing an error value.
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! enum Result<T, E> {
|
|
|
|
//! Ok(T),
|
|
|
|
//! Err(E)
|
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! Functions return `Result` whenever errors are expected and
|
|
|
|
//! recoverable. In the `std` crate `Result` is most prominently used
|
2014-05-09 15:57:37 -05:00
|
|
|
//! for [I/O](../../std/io/index.html).
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! A simple function returning `Result` might be
|
|
|
|
//! defined and used like so:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! #[deriving(Show)]
|
|
|
|
//! enum Version { Version1, Version2 }
|
|
|
|
//!
|
|
|
|
//! fn parse_version(header: &[u8]) -> Result<Version, &'static str> {
|
|
|
|
//! if header.len() < 1 {
|
2014-04-15 01:12:34 -05:00
|
|
|
//! return Err("invalid header length");
|
2014-04-12 18:33:21 -05:00
|
|
|
//! }
|
|
|
|
//! match header[0] {
|
2014-11-06 02:05:53 -06:00
|
|
|
//! 1 => Ok(Version::Version1),
|
|
|
|
//! 2 => Ok(Version::Version2),
|
2014-04-12 18:33:21 -05:00
|
|
|
//! _ => Err("invalid version")
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! let version = parse_version(&[1, 2, 3, 4]);
|
|
|
|
//! match version {
|
|
|
|
//! Ok(v) => {
|
|
|
|
//! println!("working with version: {}", v);
|
|
|
|
//! }
|
|
|
|
//! Err(e) => {
|
|
|
|
//! println!("error parsing header: {}", e);
|
|
|
|
//! }
|
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! Pattern matching on `Result`s is clear and straightforward for
|
|
|
|
//! simple cases, but `Result` comes with some convenience methods
|
2014-11-22 21:13:00 -06:00
|
|
|
//! that make working with it more succinct.
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! let good_result: Result<int, int> = Ok(10);
|
|
|
|
//! let bad_result: Result<int, int> = Err(10);
|
|
|
|
//!
|
|
|
|
//! // The `is_ok` and `is_err` methods do what they say.
|
|
|
|
//! assert!(good_result.is_ok() && !good_result.is_err());
|
|
|
|
//! assert!(bad_result.is_err() && !bad_result.is_ok());
|
|
|
|
//!
|
|
|
|
//! // `map` consumes the `Result` and produces another.
|
|
|
|
//! let good_result: Result<int, int> = good_result.map(|i| i + 1);
|
|
|
|
//! let bad_result: Result<int, int> = bad_result.map(|i| i - 1);
|
|
|
|
//!
|
|
|
|
//! // Use `and_then` to continue the computation.
|
|
|
|
//! let good_result: Result<bool, int> = good_result.and_then(|i| Ok(i == 11));
|
|
|
|
//!
|
|
|
|
//! // Use `or_else` to handle the error.
|
|
|
|
//! let bad_result: Result<int, int> = bad_result.or_else(|i| Ok(11));
|
|
|
|
//!
|
2014-04-15 01:12:34 -05:00
|
|
|
//! // Consume the result and return the contents with `unwrap`.
|
2014-04-12 18:33:21 -05:00
|
|
|
//! let final_awesome_result = good_result.ok().unwrap();
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! # Results must be used
|
|
|
|
//!
|
2014-04-15 01:12:34 -05:00
|
|
|
//! A common problem with using return values to indicate errors is
|
|
|
|
//! that it is easy to ignore the return value, thus failing to handle
|
|
|
|
//! the error. Result is annotated with the #[must_use] attribute,
|
|
|
|
//! which will cause the compiler to issue a warning when a Result
|
|
|
|
//! value is ignored. This makes `Result` especially useful with
|
|
|
|
//! functions that may encounter errors but don't otherwise return a
|
|
|
|
//! useful value.
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! Consider the `write_line` method defined for I/O types
|
|
|
|
//! by the [`Writer`](../io/trait.Writer.html) trait:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! use std::io::IoError;
|
|
|
|
//!
|
|
|
|
//! trait Writer {
|
|
|
|
//! fn write_line(&mut self, s: &str) -> Result<(), IoError>;
|
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! *Note: The actual definition of `Writer` uses `IoResult`, which
|
2014-04-20 23:49:39 -05:00
|
|
|
//! is just a synonym for `Result<T, IoError>`.*
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
2014-06-08 23:00:52 -05:00
|
|
|
//! This method doesn't produce a value, but the write may
|
2014-04-12 18:33:21 -05:00
|
|
|
//! fail. It's crucial to handle the error case, and *not* write
|
|
|
|
//! something like this:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```{.ignore}
|
2014-04-12 18:33:21 -05:00
|
|
|
//! use std::io::{File, Open, Write};
|
|
|
|
//!
|
|
|
|
//! let mut file = File::open_mode(&Path::new("valuable_data.txt"), Open, Write);
|
|
|
|
//! // If `write_line` errors, then we'll never know, because the return
|
|
|
|
//! // value is ignored.
|
|
|
|
//! file.write_line("important message");
|
|
|
|
//! drop(file);
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! If you *do* write that in Rust, the compiler will by give you a
|
|
|
|
//! warning (by default, controlled by the `unused_must_use` lint).
|
|
|
|
//!
|
|
|
|
//! You might instead, if you don't want to handle the error, simply
|
2014-10-09 14:17:22 -05:00
|
|
|
//! panic, by converting to an `Option` with `ok`, then asserting
|
|
|
|
//! success with `expect`. This will panic if the write fails, proving
|
2014-04-12 18:33:21 -05:00
|
|
|
//! a marginally useful message indicating why:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```{.no_run}
|
2014-04-12 18:33:21 -05:00
|
|
|
//! use std::io::{File, Open, Write};
|
|
|
|
//!
|
|
|
|
//! let mut file = File::open_mode(&Path::new("valuable_data.txt"), Open, Write);
|
|
|
|
//! file.write_line("important message").ok().expect("failed to write message");
|
|
|
|
//! drop(file);
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! You might also simply assert success:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```{.no_run}
|
2014-04-12 18:33:21 -05:00
|
|
|
//! # use std::io::{File, Open, Write};
|
|
|
|
//!
|
|
|
|
//! # let mut file = File::open_mode(&Path::new("valuable_data.txt"), Open, Write);
|
|
|
|
//! assert!(file.write_line("important message").is_ok());
|
|
|
|
//! # drop(file);
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! Or propagate the error up the call stack with `try!`:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! # use std::io::{File, Open, Write, IoError};
|
|
|
|
//! fn write_message() -> Result<(), IoError> {
|
|
|
|
//! let mut file = File::open_mode(&Path::new("valuable_data.txt"), Open, Write);
|
|
|
|
//! try!(file.write_line("important message"));
|
|
|
|
//! drop(file);
|
|
|
|
//! return Ok(());
|
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! # The `try!` macro
|
|
|
|
//!
|
|
|
|
//! When writing code that calls many functions that return the
|
|
|
|
//! `Result` type, the error handling can be tedious. The `try!`
|
|
|
|
//! macro hides some of the boilerplate of propagating errors up the
|
|
|
|
//! call stack.
|
|
|
|
//!
|
|
|
|
//! It replaces this:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! use std::io::{File, Open, Write, IoError};
|
|
|
|
//!
|
2014-05-20 01:19:56 -05:00
|
|
|
//! struct Info {
|
2014-05-22 18:57:53 -05:00
|
|
|
//! name: String,
|
2014-05-20 01:19:56 -05:00
|
|
|
//! age: int,
|
|
|
|
//! rating: int
|
|
|
|
//! }
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! fn write_info(info: &Info) -> Result<(), IoError> {
|
|
|
|
//! let mut file = File::open_mode(&Path::new("my_best_friends.txt"), Open, Write);
|
|
|
|
//! // Early return on error
|
2014-05-20 01:19:56 -05:00
|
|
|
//! match file.write_line(format!("name: {}", info.name).as_slice()) {
|
2014-04-12 18:33:21 -05:00
|
|
|
//! Ok(_) => (),
|
|
|
|
//! Err(e) => return Err(e)
|
|
|
|
//! }
|
2014-05-20 01:19:56 -05:00
|
|
|
//! match file.write_line(format!("age: {}", info.age).as_slice()) {
|
2014-04-12 18:33:21 -05:00
|
|
|
//! Ok(_) => (),
|
|
|
|
//! Err(e) => return Err(e)
|
|
|
|
//! }
|
2014-05-20 01:19:56 -05:00
|
|
|
//! return file.write_line(format!("rating: {}", info.rating).as_slice());
|
2014-04-12 18:33:21 -05:00
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! With this:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//! use std::io::{File, Open, Write, IoError};
|
|
|
|
//!
|
2014-05-20 01:19:56 -05:00
|
|
|
//! struct Info {
|
2014-05-22 18:57:53 -05:00
|
|
|
//! name: String,
|
2014-05-20 01:19:56 -05:00
|
|
|
//! age: int,
|
|
|
|
//! rating: int
|
|
|
|
//! }
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! fn write_info(info: &Info) -> Result<(), IoError> {
|
|
|
|
//! let mut file = File::open_mode(&Path::new("my_best_friends.txt"), Open, Write);
|
|
|
|
//! // Early return on error
|
2014-05-20 01:19:56 -05:00
|
|
|
//! try!(file.write_line(format!("name: {}", info.name).as_slice()));
|
|
|
|
//! try!(file.write_line(format!("age: {}", info.age).as_slice()));
|
|
|
|
//! try!(file.write_line(format!("rating: {}", info.rating).as_slice()));
|
2014-04-12 18:33:21 -05:00
|
|
|
//! return Ok(());
|
|
|
|
//! }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! *It's much nicer!*
|
|
|
|
//!
|
|
|
|
//! Wrapping an expression in `try!` will result in the unwrapped
|
|
|
|
//! success (`Ok`) value, unless the result is `Err`, in which case
|
|
|
|
//! `Err` is returned early from the enclosing function. Its simple definition
|
|
|
|
//! makes it clear:
|
|
|
|
//!
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-15 01:12:34 -05:00
|
|
|
//! # #![feature(macro_rules)]
|
2014-04-12 18:33:21 -05:00
|
|
|
//! macro_rules! try(
|
|
|
|
//! ($e:expr) => (match $e { Ok(e) => e, Err(e) => return Err(e) })
|
2014-11-14 11:18:10 -06:00
|
|
|
//! );
|
2014-04-15 01:12:34 -05:00
|
|
|
//! # fn main() { }
|
2014-09-16 06:27:34 -05:00
|
|
|
//! ```
|
2014-04-12 18:33:21 -05:00
|
|
|
//!
|
|
|
|
//! `try!` is imported by the prelude, and is available everywhere.
|
2011-12-13 18:25:51 -06:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
#![stable]
|
|
|
|
|
2014-12-08 11:58:01 -06:00
|
|
|
use self::Result::*;
|
2014-11-06 02:05:53 -06:00
|
|
|
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
use kinds::Copy;
|
2014-05-11 13:14:14 -05:00
|
|
|
use std::fmt::Show;
|
2014-08-19 15:45:28 -05:00
|
|
|
use slice;
|
2014-10-06 21:55:52 -05:00
|
|
|
use slice::AsSlice;
|
2014-11-06 11:32:37 -06:00
|
|
|
use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, ExactSizeIterator};
|
2014-11-28 10:57:41 -06:00
|
|
|
use option::Option;
|
|
|
|
use option::Option::{None, Some};
|
2014-12-02 11:47:07 -06:00
|
|
|
use ops::{FnMut, FnOnce};
|
2013-08-03 18:59:24 -05:00
|
|
|
|
|
|
|
/// `Result` is a type that represents either success (`Ok`) or failure (`Err`).
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// See the [`std::result`](index.html) module documentation for details.
|
2014-12-12 20:43:07 -06:00
|
|
|
#[deriving(Clone, PartialEq, PartialOrd, Eq, Ord, Show, Hash)]
|
2014-01-23 11:53:05 -06:00
|
|
|
#[must_use]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-08-03 18:59:24 -05:00
|
|
|
pub enum Result<T, E> {
|
2013-12-06 15:23:23 -06:00
|
|
|
/// Contains the success value
|
2012-08-26 18:54:31 -05:00
|
|
|
Ok(T),
|
2013-12-06 15:23:23 -06:00
|
|
|
|
2012-07-04 16:53:12 -05:00
|
|
|
/// Contains the error value
|
2013-08-03 18:59:24 -05:00
|
|
|
Err(E)
|
2011-12-13 18:25:51 -06:00
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Type implementation
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
impl<T, E> Result<T, E> {
|
2013-10-31 17:09:24 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Querying the contained values
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
2013-04-10 15:11:35 -05:00
|
|
|
|
2013-07-24 22:41:13 -05:00
|
|
|
/// Returns true if the result is `Ok`
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
|
|
|
/// let x: Result<int, &str> = Ok(-3);
|
|
|
|
/// assert_eq!(x.is_ok(), true);
|
|
|
|
///
|
|
|
|
/// let x: Result<int, &str> = Err("Some error message");
|
|
|
|
/// assert_eq!(x.is_ok(), false);
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-07-26 20:03:44 -05:00
|
|
|
pub fn is_ok(&self) -> bool {
|
|
|
|
match *self {
|
|
|
|
Ok(_) => true,
|
|
|
|
Err(_) => false
|
|
|
|
}
|
|
|
|
}
|
2012-04-01 17:44:01 -05:00
|
|
|
|
2013-07-24 22:41:13 -05:00
|
|
|
/// Returns true if the result is `Err`
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
|
|
|
/// let x: Result<int, &str> = Ok(-3);
|
|
|
|
/// assert_eq!(x.is_err(), false);
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// let x: Result<int, &str> = Err("Some error message");
|
|
|
|
/// assert_eq!(x.is_err(), true);
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-07-26 20:03:44 -05:00
|
|
|
pub fn is_err(&self) -> bool {
|
|
|
|
!self.is_ok()
|
|
|
|
}
|
2012-04-01 17:44:01 -05:00
|
|
|
|
2012-12-18 20:55:19 -06:00
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
2013-12-06 15:23:23 -06:00
|
|
|
// Adapter for each variant
|
2013-10-31 17:09:24 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
/// Convert from `Result<T, E>` to `Option<T>`
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// Converts `self` into an `Option<T>`, consuming `self`,
|
|
|
|
/// and discarding the error, if any.
|
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// # Example
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// assert_eq!(x.ok(), Some(2));
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// let x: Result<uint, &str> = Err("Nothing here");
|
|
|
|
/// assert_eq!(x.ok(), None);
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-12-06 15:23:23 -06:00
|
|
|
pub fn ok(self) -> Option<T> {
|
2013-07-26 20:03:57 -05:00
|
|
|
match self {
|
2013-12-06 15:23:23 -06:00
|
|
|
Ok(x) => Some(x),
|
|
|
|
Err(_) => None,
|
2013-07-26 20:03:57 -05:00
|
|
|
}
|
|
|
|
}
|
2012-12-18 20:55:19 -06:00
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
/// Convert from `Result<T, E>` to `Option<E>`
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// Converts `self` into an `Option<T>`, consuming `self`,
|
|
|
|
/// and discarding the value, if any.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// assert_eq!(x.err(), None);
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("Nothing here");
|
|
|
|
/// assert_eq!(x.err(), Some("Nothing here"));
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-12-06 15:23:23 -06:00
|
|
|
pub fn err(self) -> Option<E> {
|
2013-10-31 17:09:24 -05:00
|
|
|
match self {
|
2013-12-06 15:23:23 -06:00
|
|
|
Ok(_) => None,
|
|
|
|
Err(x) => Some(x),
|
2013-10-31 17:09:24 -05:00
|
|
|
}
|
2013-08-03 18:59:24 -05:00
|
|
|
}
|
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Adapter for working with references
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/// Convert from `Result<T, E>` to `Result<&T, &E>`
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// Produces a new `Result`, containing a reference
|
|
|
|
/// into the original, leaving the original in place.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// assert_eq!(x.as_ref(), Ok(&2));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("Error");
|
|
|
|
/// assert_eq!(x.as_ref(), Err(&"Error"));
|
|
|
|
/// ```
|
2013-08-03 18:59:24 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-12-06 15:23:23 -06:00
|
|
|
pub fn as_ref<'r>(&'r self) -> Result<&'r T, &'r E> {
|
|
|
|
match *self {
|
|
|
|
Ok(ref x) => Ok(x),
|
|
|
|
Err(ref x) => Err(x),
|
2013-08-03 18:59:24 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
/// Convert from `Result<T, E>` to `Result<&mut T, &mut E>`
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// fn mutate(r: &mut Result<int, int>) {
|
|
|
|
/// match r.as_mut() {
|
|
|
|
/// Ok(&ref mut v) => *v = 42,
|
|
|
|
/// Err(&ref mut e) => *e = 0,
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// let mut x: Result<int, int> = Ok(2);
|
|
|
|
/// mutate(&mut x);
|
|
|
|
/// assert_eq!(x.unwrap(), 42);
|
|
|
|
///
|
|
|
|
/// let mut x: Result<int, int> = Err(13);
|
|
|
|
/// mutate(&mut x);
|
|
|
|
/// assert_eq!(x.unwrap_err(), 0);
|
|
|
|
/// ```
|
2013-08-03 18:59:24 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for mut conventions"]
|
2013-12-06 15:23:23 -06:00
|
|
|
pub fn as_mut<'r>(&'r mut self) -> Result<&'r mut T, &'r mut E> {
|
|
|
|
match *self {
|
|
|
|
Ok(ref mut x) => Ok(x),
|
|
|
|
Err(ref mut x) => Err(x),
|
2013-07-26 20:03:57 -05:00
|
|
|
}
|
|
|
|
}
|
2012-12-18 20:55:19 -06:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
/// Convert from `Result<T, E>` to `&mut [T]` (without copying)
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let mut x: Result<&str, uint> = Ok("Gold");
|
|
|
|
/// {
|
|
|
|
/// let v = x.as_mut_slice();
|
2014-11-21 00:20:04 -06:00
|
|
|
/// assert!(v == ["Gold"]);
|
2014-09-16 10:09:24 -05:00
|
|
|
/// v[0] = "Silver";
|
2014-11-21 00:20:04 -06:00
|
|
|
/// assert!(v == ["Silver"]);
|
2014-09-16 10:09:24 -05:00
|
|
|
/// }
|
|
|
|
/// assert_eq!(x, Ok("Silver"));
|
|
|
|
///
|
|
|
|
/// let mut x: Result<&str, uint> = Err(45);
|
2014-11-21 00:20:04 -06:00
|
|
|
/// assert!(x.as_mut_slice().is_empty());
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
2014-08-19 15:45:28 -05:00
|
|
|
#[inline]
|
|
|
|
#[unstable = "waiting for mut conventions"]
|
|
|
|
pub fn as_mut_slice<'r>(&'r mut self) -> &'r mut [T] {
|
|
|
|
match *self {
|
|
|
|
Ok(ref mut x) => slice::mut_ref_slice(x),
|
|
|
|
Err(_) => {
|
|
|
|
// work around lack of implicit coercion from fixed-size array to slice
|
|
|
|
let emp: &mut [_] = &mut [];
|
|
|
|
emp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Transforming contained values
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2014-01-30 12:29:35 -06:00
|
|
|
/// Maps a `Result<T, E>` to `Result<U, E>` by applying a function to an
|
2013-10-31 17:09:24 -05:00
|
|
|
/// contained `Ok` value, leaving an `Err` value untouched.
|
2013-08-04 18:05:25 -05:00
|
|
|
///
|
2013-10-31 17:09:24 -05:00
|
|
|
/// This function can be used to compose the results of two functions.
|
2013-08-04 18:05:25 -05:00
|
|
|
///
|
2014-09-16 06:27:34 -05:00
|
|
|
/// # Example
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// Sum the lines of a buffer by mapping strings to numbers,
|
|
|
|
/// ignoring I/O and parse errors:
|
|
|
|
///
|
2014-09-16 06:27:34 -05:00
|
|
|
/// ```
|
2014-12-04 09:57:13 -06:00
|
|
|
/// use std::io::IoResult;
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
2014-12-04 09:57:13 -06:00
|
|
|
/// let mut buffer = &mut b"1\n2\n3\n4\n";
|
2014-04-12 18:33:21 -05:00
|
|
|
///
|
|
|
|
/// let mut sum = 0;
|
2013-08-04 18:05:25 -05:00
|
|
|
///
|
2014-11-30 18:55:53 -06:00
|
|
|
/// while !buffer.is_empty() {
|
|
|
|
/// let line: IoResult<String> = buffer.read_line();
|
2014-04-12 18:33:21 -05:00
|
|
|
/// // Convert the string line to a number using `map` and `from_str`
|
|
|
|
/// let val: IoResult<int> = line.map(|line| {
|
2014-05-31 14:50:52 -05:00
|
|
|
/// from_str::<int>(line.as_slice().trim_right()).unwrap_or(0)
|
2014-04-12 18:33:21 -05:00
|
|
|
/// });
|
|
|
|
/// // Add the value if there were no errors, otherwise add 0
|
|
|
|
/// sum += val.ok().unwrap_or(0);
|
|
|
|
/// }
|
2014-05-31 14:50:52 -05:00
|
|
|
///
|
|
|
|
/// assert!(sum == 10);
|
2014-09-16 06:27:34 -05:00
|
|
|
/// ```
|
2013-08-04 18:05:25 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for unboxed closures"]
|
2014-12-02 11:47:07 -06:00
|
|
|
pub fn map<U, F: FnOnce(T) -> U>(self, op: F) -> Result<U,E> {
|
2013-08-04 18:05:25 -05:00
|
|
|
match self {
|
|
|
|
Ok(t) => Ok(op(t)),
|
|
|
|
Err(e) => Err(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-30 12:29:35 -06:00
|
|
|
/// Maps a `Result<T, E>` to `Result<T, F>` by applying a function to an
|
2013-10-31 17:09:24 -05:00
|
|
|
/// contained `Err` value, leaving an `Ok` value untouched.
|
2013-08-04 18:05:25 -05:00
|
|
|
///
|
2013-10-31 17:09:24 -05:00
|
|
|
/// This function can be used to pass through a successful result while handling
|
|
|
|
/// an error.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// fn stringify(x: uint) -> String { format!("error code: {}", x) }
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, uint> = Ok(2u);
|
|
|
|
/// assert_eq!(x.map_err(stringify), Ok(2u));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, uint> = Err(13);
|
|
|
|
/// assert_eq!(x.map_err(stringify), Err("error code: 13".to_string()));
|
|
|
|
/// ```
|
2013-08-04 18:05:25 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for unboxed closures"]
|
2014-12-02 11:47:07 -06:00
|
|
|
pub fn map_err<F, O: FnOnce(E) -> F>(self, op: O) -> Result<T,F> {
|
2013-08-04 18:05:25 -05:00
|
|
|
match self {
|
|
|
|
Ok(t) => Ok(t),
|
|
|
|
Err(e) => Err(op(e))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Iterator constructors
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/// Returns an iterator over the possibly contained value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(7);
|
|
|
|
/// assert_eq!(x.iter().next(), Some(&7));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("nothing!");
|
|
|
|
/// assert_eq!(x.iter().next(), None);
|
|
|
|
/// ```
|
2014-08-19 15:45:28 -05:00
|
|
|
#[inline]
|
|
|
|
#[unstable = "waiting for iterator conventions"]
|
|
|
|
pub fn iter<'r>(&'r self) -> Item<&'r T> {
|
|
|
|
Item{opt: self.as_ref().ok()}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a mutable iterator over the possibly contained value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let mut x: Result<uint, &str> = Ok(7);
|
|
|
|
/// match x.iter_mut().next() {
|
|
|
|
/// Some(&ref mut x) => *x = 40,
|
|
|
|
/// None => {},
|
|
|
|
/// }
|
|
|
|
/// assert_eq!(x, Ok(40));
|
|
|
|
///
|
|
|
|
/// let mut x: Result<uint, &str> = Err("nothing!");
|
|
|
|
/// assert_eq!(x.iter_mut().next(), None);
|
|
|
|
/// ```
|
2014-08-19 15:45:28 -05:00
|
|
|
#[inline]
|
|
|
|
#[unstable = "waiting for iterator conventions"]
|
2014-09-14 17:57:55 -05:00
|
|
|
pub fn iter_mut<'r>(&'r mut self) -> Item<&'r mut T> {
|
2014-08-19 15:45:28 -05:00
|
|
|
Item{opt: self.as_mut().ok()}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a consuming iterator over the possibly contained value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(5);
|
|
|
|
/// let v: Vec<uint> = x.into_iter().collect();
|
|
|
|
/// assert_eq!(v, vec![5u]);
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("nothing!");
|
|
|
|
/// let v: Vec<uint> = x.into_iter().collect();
|
|
|
|
/// assert_eq!(v, vec![]);
|
|
|
|
/// ```
|
2014-08-19 15:45:28 -05:00
|
|
|
#[inline]
|
|
|
|
#[unstable = "waiting for iterator conventions"]
|
2014-09-14 17:57:55 -05:00
|
|
|
pub fn into_iter(self) -> Item<T> {
|
2014-08-19 15:45:28 -05:00
|
|
|
Item{opt: self.ok()}
|
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
// Boolean operations on the values, eager and lazy
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/// Returns `res` if the result is `Ok`, otherwise returns the `Err` value of `self`.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// let y: Result<&str, &str> = Err("late error");
|
|
|
|
/// assert_eq!(x.and(y), Err("late error"));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("early error");
|
|
|
|
/// let y: Result<&str, &str> = Ok("foo");
|
|
|
|
/// assert_eq!(x.and(y), Err("early error"));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("not a 2");
|
|
|
|
/// let y: Result<&str, &str> = Err("late error");
|
|
|
|
/// assert_eq!(x.and(y), Err("not a 2"));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// let y: Result<&str, &str> = Ok("different result type");
|
|
|
|
/// assert_eq!(x.and(y), Ok("different result type"));
|
|
|
|
/// ```
|
2013-10-31 17:09:24 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-10-31 17:09:24 -05:00
|
|
|
pub fn and<U>(self, res: Result<U, E>) -> Result<U, E> {
|
2013-09-11 14:52:17 -05:00
|
|
|
match self {
|
|
|
|
Ok(_) => res,
|
2013-10-31 17:09:24 -05:00
|
|
|
Err(e) => Err(e),
|
2013-09-11 14:52:17 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/// Calls `op` if the result is `Ok`, otherwise returns the `Err` value of `self`.
|
2013-08-03 18:59:24 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// This function can be used for control flow based on result values.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// fn sq(x: uint) -> Result<uint, uint> { Ok(x * x) }
|
|
|
|
/// fn err(x: uint) -> Result<uint, uint> { Err(x) }
|
|
|
|
///
|
|
|
|
/// assert_eq!(Ok(2).and_then(sq).and_then(sq), Ok(16));
|
|
|
|
/// assert_eq!(Ok(2).and_then(sq).and_then(err), Err(4));
|
|
|
|
/// assert_eq!(Ok(2).and_then(err).and_then(sq), Err(2));
|
|
|
|
/// assert_eq!(Err(3).and_then(sq).and_then(sq), Err(3));
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for unboxed closures"]
|
2014-12-02 11:47:07 -06:00
|
|
|
pub fn and_then<U, F: FnOnce(T) -> Result<U, E>>(self, op: F) -> Result<U, E> {
|
2013-07-22 19:27:53 -05:00
|
|
|
match self {
|
|
|
|
Ok(t) => op(t),
|
2013-07-24 22:41:13 -05:00
|
|
|
Err(e) => Err(e),
|
2013-07-22 19:27:53 -05:00
|
|
|
}
|
2012-05-26 22:33:08 -05:00
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/// Returns `res` if the result is `Err`, otherwise returns the `Ok` value of `self`.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// let y: Result<uint, &str> = Err("late error");
|
|
|
|
/// assert_eq!(x.or(y), Ok(2));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("early error");
|
|
|
|
/// let y: Result<uint, &str> = Ok(2);
|
|
|
|
/// assert_eq!(x.or(y), Ok(2));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("not a 2");
|
|
|
|
/// let y: Result<uint, &str> = Err("late error");
|
|
|
|
/// assert_eq!(x.or(y), Err("late error"));
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Ok(2);
|
|
|
|
/// let y: Result<uint, &str> = Ok(100);
|
|
|
|
/// assert_eq!(x.or(y), Ok(2));
|
|
|
|
/// ```
|
2013-09-11 14:52:17 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[stable]
|
2013-09-11 14:52:17 -05:00
|
|
|
pub fn or(self, res: Result<T, E>) -> Result<T, E> {
|
|
|
|
match self {
|
|
|
|
Ok(_) => self,
|
|
|
|
Err(_) => res,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-31 17:09:24 -05:00
|
|
|
/// Calls `op` if the result is `Err`, otherwise returns the `Ok` value of `self`.
|
2013-08-03 18:59:24 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// This function can be used for control flow based on result values.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// fn sq(x: uint) -> Result<uint, uint> { Ok(x * x) }
|
|
|
|
/// fn err(x: uint) -> Result<uint, uint> { Err(x) }
|
|
|
|
///
|
|
|
|
/// assert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));
|
|
|
|
/// assert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));
|
|
|
|
/// assert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));
|
|
|
|
/// assert_eq!(Err(3).or_else(err).or_else(err), Err(3));
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for unboxed closures"]
|
2014-12-02 11:47:07 -06:00
|
|
|
pub fn or_else<F, O: FnOnce(E) -> Result<T, F>>(self, op: O) -> Result<T, F> {
|
2013-07-22 19:27:53 -05:00
|
|
|
match self {
|
|
|
|
Ok(t) => Ok(t),
|
2013-07-24 22:41:13 -05:00
|
|
|
Err(e) => op(e),
|
2013-07-22 19:27:53 -05:00
|
|
|
}
|
2012-05-26 22:33:08 -05:00
|
|
|
}
|
2012-06-22 19:32:52 -05:00
|
|
|
|
2013-12-06 15:23:23 -06:00
|
|
|
/// Unwraps a result, yielding the content of an `Ok`.
|
2014-04-11 22:59:18 -05:00
|
|
|
/// Else it returns `optb`.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let optb = 2u;
|
|
|
|
/// let x: Result<uint, &str> = Ok(9u);
|
|
|
|
/// assert_eq!(x.unwrap_or(optb), 9u);
|
|
|
|
///
|
|
|
|
/// let x: Result<uint, &str> = Err("error");
|
|
|
|
/// assert_eq!(x.unwrap_or(optb), optb);
|
|
|
|
/// ```
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for conventions"]
|
2014-04-11 22:59:18 -05:00
|
|
|
pub fn unwrap_or(self, optb: T) -> T {
|
2013-12-06 15:23:23 -06:00
|
|
|
match self {
|
|
|
|
Ok(t) => t,
|
2014-04-11 22:59:18 -05:00
|
|
|
Err(_) => optb
|
2013-12-06 15:23:23 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-11 21:18:02 -05:00
|
|
|
/// Unwraps a result, yielding the content of an `Ok`.
|
2014-04-11 22:59:18 -05:00
|
|
|
/// If the value is an `Err` then it calls `op` with its value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// fn count(x: &str) -> uint { x.len() }
|
|
|
|
///
|
|
|
|
/// assert_eq!(Ok(2u).unwrap_or_else(count), 2u);
|
|
|
|
/// assert_eq!(Err("foo").unwrap_or_else(count), 3u);
|
|
|
|
/// ```
|
2014-04-11 21:18:02 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for conventions"]
|
2014-12-02 11:47:07 -06:00
|
|
|
pub fn unwrap_or_else<F: FnOnce(E) -> T>(self, op: F) -> T {
|
2014-04-11 21:18:02 -05:00
|
|
|
match self {
|
|
|
|
Ok(t) => t,
|
2014-04-11 22:59:18 -05:00
|
|
|
Err(e) => op(e)
|
2014-04-11 21:18:02 -05:00
|
|
|
}
|
|
|
|
}
|
2014-04-11 22:59:18 -05:00
|
|
|
}
|
2014-04-11 21:18:02 -05:00
|
|
|
|
2014-05-10 15:46:05 -05:00
|
|
|
impl<T, E: Show> Result<T, E> {
|
|
|
|
/// Unwraps a result, yielding the content of an `Ok`.
|
|
|
|
///
|
2014-10-09 14:17:22 -05:00
|
|
|
/// # Panics
|
2014-07-12 10:02:15 -05:00
|
|
|
///
|
2014-10-09 14:17:22 -05:00
|
|
|
/// Panics if the value is an `Err`, with a custom panic message provided
|
2014-07-12 10:02:15 -05:00
|
|
|
/// by the `Err`'s value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Ok(2u);
|
|
|
|
/// assert_eq!(x.unwrap(), 2u);
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```{.should_fail}
|
|
|
|
/// let x: Result<uint, &str> = Err("emergency failure");
|
2014-10-09 14:17:22 -05:00
|
|
|
/// x.unwrap(); // panics with `emergency failure`
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
2014-05-10 15:46:05 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for conventions"]
|
2014-05-10 15:46:05 -05:00
|
|
|
pub fn unwrap(self) -> T {
|
|
|
|
match self {
|
|
|
|
Ok(t) => t,
|
|
|
|
Err(e) =>
|
2014-10-09 14:17:22 -05:00
|
|
|
panic!("called `Result::unwrap()` on an `Err` value: {}", e)
|
2014-05-10 15:46:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: Show, E> Result<T, E> {
|
|
|
|
/// Unwraps a result, yielding the content of an `Err`.
|
|
|
|
///
|
2014-10-09 14:17:22 -05:00
|
|
|
/// # Panics
|
2014-07-12 10:02:15 -05:00
|
|
|
///
|
2014-10-09 14:17:22 -05:00
|
|
|
/// Panics if the value is an `Ok`, with a custom panic message provided
|
2014-07-12 10:02:15 -05:00
|
|
|
/// by the `Ok`'s value.
|
2014-09-16 10:09:24 -05:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```{.should_fail}
|
|
|
|
/// let x: Result<uint, &str> = Ok(2u);
|
2014-10-09 14:17:22 -05:00
|
|
|
/// x.unwrap_err(); // panics with `2`
|
2014-09-16 10:09:24 -05:00
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// let x: Result<uint, &str> = Err("emergency failure");
|
|
|
|
/// assert_eq!(x.unwrap_err(), "emergency failure");
|
|
|
|
/// ```
|
2014-05-10 15:46:05 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[unstable = "waiting for conventions"]
|
2014-05-10 15:46:05 -05:00
|
|
|
pub fn unwrap_err(self) -> E {
|
|
|
|
match self {
|
|
|
|
Ok(t) =>
|
2014-10-09 14:17:22 -05:00
|
|
|
panic!("called `Result::unwrap_err()` on an `Ok` value: {}", t),
|
2014-05-10 15:46:05 -05:00
|
|
|
Err(e) => e
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-06 21:55:52 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Trait implementations
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
impl<T, E> AsSlice<T> for Result<T, E> {
|
|
|
|
/// Convert from `Result<T, E>` to `&[T]` (without copying)
|
|
|
|
#[inline]
|
|
|
|
#[stable]
|
|
|
|
fn as_slice<'a>(&'a self) -> &'a [T] {
|
|
|
|
match *self {
|
|
|
|
Ok(ref x) => slice::ref_slice(x),
|
|
|
|
Err(_) => {
|
|
|
|
// work around lack of implicit coercion from fixed-size array to slice
|
|
|
|
let emp: &[_] = &[];
|
|
|
|
emp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// The Result Iterator
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/// A `Result` iterator that yields either one or zero elements
|
2014-06-17 20:55:42 -05:00
|
|
|
///
|
2014-09-16 10:09:24 -05:00
|
|
|
/// The `Item` iterator is returned by the `iter`, `iter_mut` and `into_iter`
|
2014-08-19 15:45:28 -05:00
|
|
|
/// methods on `Result`.
|
|
|
|
#[deriving(Clone)]
|
|
|
|
#[unstable = "waiting for iterator conventions"]
|
|
|
|
pub struct Item<T> {
|
|
|
|
opt: Option<T>
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> Iterator<T> for Item<T> {
|
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<T> {
|
|
|
|
self.opt.take()
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
match self.opt {
|
|
|
|
Some(_) => (1, Some(1)),
|
|
|
|
None => (0, Some(0)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-06-23 18:27:54 -05:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
impl<A> DoubleEndedIterator<A> for Item<A> {
|
|
|
|
#[inline]
|
|
|
|
fn next_back(&mut self) -> Option<A> {
|
|
|
|
self.opt.take()
|
2014-06-23 18:27:54 -05:00
|
|
|
}
|
2014-08-19 15:45:28 -05:00
|
|
|
}
|
|
|
|
|
2014-11-06 11:32:37 -06:00
|
|
|
impl<A> ExactSizeIterator<A> for Item<A> {}
|
2014-06-23 18:27:54 -05:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2014-11-14 22:39:41 -06:00
|
|
|
// FromIterator
|
2014-08-19 15:45:28 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2014-11-14 22:39:41 -06:00
|
|
|
#[stable]
|
2014-08-19 15:45:28 -05:00
|
|
|
impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
|
|
|
|
/// Takes each element in the `Iterator`: if it is an `Err`, no further
|
|
|
|
/// elements are taken, and the `Err` is returned. Should no `Err` occur, a
|
|
|
|
/// container with the values of each `Result` is returned.
|
|
|
|
///
|
|
|
|
/// Here is an example which increments every integer in a vector,
|
|
|
|
/// checking for overflow:
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// use std::uint;
|
|
|
|
///
|
|
|
|
/// let v = vec!(1u, 2u);
|
2014-10-31 04:40:15 -05:00
|
|
|
/// let res: Result<Vec<uint>, &'static str> = v.iter().map(|&x: &uint|
|
|
|
|
/// if x == uint::MAX { Err("Overflow!") }
|
2014-08-19 15:45:28 -05:00
|
|
|
/// else { Ok(x + 1) }
|
|
|
|
/// ).collect();
|
|
|
|
/// assert!(res == Ok(vec!(2u, 3u)));
|
|
|
|
/// ```
|
|
|
|
#[inline]
|
|
|
|
fn from_iter<I: Iterator<Result<A, E>>>(iter: I) -> Result<V, E> {
|
|
|
|
// FIXME(#11084): This could be replaced with Iterator::scan when this
|
|
|
|
// performance bug is closed.
|
|
|
|
|
|
|
|
struct Adapter<Iter, E> {
|
|
|
|
iter: Iter,
|
|
|
|
err: Option<E>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T, E, Iter: Iterator<Result<T, E>>> Iterator<T> for Adapter<Iter, E> {
|
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<T> {
|
|
|
|
match self.iter.next() {
|
|
|
|
Some(Ok(value)) => Some(value),
|
|
|
|
Some(Err(err)) => {
|
|
|
|
self.err = Some(err);
|
|
|
|
None
|
|
|
|
}
|
|
|
|
None => None,
|
2014-06-23 18:27:54 -05:00
|
|
|
}
|
2013-12-20 22:56:07 -06:00
|
|
|
}
|
2012-03-13 19:46:16 -05:00
|
|
|
}
|
2013-12-20 22:56:07 -06:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
let mut adapter = Adapter { iter: iter, err: None };
|
|
|
|
let v: V = FromIterator::from_iter(adapter.by_ref());
|
2013-12-20 22:56:07 -06:00
|
|
|
|
2014-08-19 15:45:28 -05:00
|
|
|
match adapter.err {
|
|
|
|
Some(err) => Err(err),
|
|
|
|
None => Ok(v),
|
|
|
|
}
|
2012-03-13 19:46:16 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-14 22:39:41 -06:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// FromIterator
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
std: Replace map_vec, map_vec2, iter_vec2 in std::result
Replace these with three functions based on iterators: collect, fold,
and fold_. The mapping part is replaced by iterator .map(), so the part
that these functions do is to accumulate the final Result<,> value.
* `result::collect` gathers `Iterator<Result<V, U>>` to `Result<~[V], U>`
* `result::fold` folds `Iterator<Result<T, E>>` to `Result<V, E>`
* `result::fold_` folds `Iterator<Result<T, E>>` to `Result<(), E>`
2013-08-12 13:24:05 -05:00
|
|
|
/// Perform a fold operation over the result values from an iterator.
|
2013-08-03 18:59:24 -05:00
|
|
|
///
|
std: Replace map_vec, map_vec2, iter_vec2 in std::result
Replace these with three functions based on iterators: collect, fold,
and fold_. The mapping part is replaced by iterator .map(), so the part
that these functions do is to accumulate the final Result<,> value.
* `result::collect` gathers `Iterator<Result<V, U>>` to `Result<~[V], U>`
* `result::fold` folds `Iterator<Result<T, E>>` to `Result<V, E>`
* `result::fold_` folds `Iterator<Result<T, E>>` to `Result<(), E>`
2013-08-12 13:24:05 -05:00
|
|
|
/// If an `Err` is encountered, it is immediately returned.
|
|
|
|
/// Otherwise, the folded value is returned.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2014-08-19 15:45:28 -05:00
|
|
|
#[experimental]
|
2013-11-18 23:15:42 -06:00
|
|
|
pub fn fold<T,
|
|
|
|
V,
|
|
|
|
E,
|
2014-12-02 11:47:07 -06:00
|
|
|
F: FnMut(V, T) -> V,
|
std: Replace map_vec, map_vec2, iter_vec2 in std::result
Replace these with three functions based on iterators: collect, fold,
and fold_. The mapping part is replaced by iterator .map(), so the part
that these functions do is to accumulate the final Result<,> value.
* `result::collect` gathers `Iterator<Result<V, U>>` to `Result<~[V], U>`
* `result::fold` folds `Iterator<Result<T, E>>` to `Result<V, E>`
* `result::fold_` folds `Iterator<Result<T, E>>` to `Result<(), E>`
2013-08-12 13:24:05 -05:00
|
|
|
Iter: Iterator<Result<T, E>>>(
|
|
|
|
mut iterator: Iter,
|
|
|
|
mut init: V,
|
2014-12-02 11:47:07 -06:00
|
|
|
mut f: F)
|
2013-11-18 23:15:42 -06:00
|
|
|
-> Result<V, E> {
|
std: Replace map_vec, map_vec2, iter_vec2 in std::result
Replace these with three functions based on iterators: collect, fold,
and fold_. The mapping part is replaced by iterator .map(), so the part
that these functions do is to accumulate the final Result<,> value.
* `result::collect` gathers `Iterator<Result<V, U>>` to `Result<~[V], U>`
* `result::fold` folds `Iterator<Result<T, E>>` to `Result<V, E>`
* `result::fold_` folds `Iterator<Result<T, E>>` to `Result<(), E>`
2013-08-12 13:24:05 -05:00
|
|
|
for t in iterator {
|
|
|
|
match t {
|
|
|
|
Ok(v) => init = f(init, v),
|
|
|
|
Err(u) => return Err(u)
|
2012-03-13 19:46:16 -05:00
|
|
|
}
|
|
|
|
}
|
std: Replace map_vec, map_vec2, iter_vec2 in std::result
Replace these with three functions based on iterators: collect, fold,
and fold_. The mapping part is replaced by iterator .map(), so the part
that these functions do is to accumulate the final Result<,> value.
* `result::collect` gathers `Iterator<Result<V, U>>` to `Result<~[V], U>`
* `result::fold` folds `Iterator<Result<T, E>>` to `Result<V, E>`
* `result::fold_` folds `Iterator<Result<T, E>>` to `Result<(), E>`
2013-08-12 13:24:05 -05:00
|
|
|
Ok(init)
|
2012-03-13 19:46:16 -05:00
|
|
|
}
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
|
|
|
|
impl<T:Copy,U:Copy> Copy for Result<T,U> {}
|
|
|
|
|