Enum std::result::Result1.0.0[][src]

pub enum Result<T, E> {
    Ok(T),
    Err(E),
}
Expand description

Result 是代表成功 (Ok) 或失败 (Err) 的类型。

有关详细信息,请参见 模块文档

Variants

Ok(T)

包含成功值

Tuple Fields of Ok

0: T
Err(E)

包含错误值

Tuple Fields of Err

0: E

Implementations

如果结果为 Ok,则返回 true

Examples

基本用法:

let x: Result<i32, &str> = Ok(-3);
assert_eq!(x.is_ok(), true);

let x: Result<i32, &str> = Err("Some error message");
assert_eq!(x.is_ok(), false);
Run

如果结果为 Err,则返回 true

Examples

基本用法:

let x: Result<i32, &str> = Ok(-3);
assert_eq!(x.is_err(), false);

let x: Result<i32, &str> = Err("Some error message");
assert_eq!(x.is_err(), true);
Run
🔬 This is a nightly-only experimental API. (option_result_contains #62358)

如果结果是包含给定值的 Ok 值,则返回 true

Examples
#![feature(option_result_contains)]

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.contains(&2), true);

let x: Result<u32, &str> = Ok(3);
assert_eq!(x.contains(&2), false);

let x: Result<u32, &str> = Err("Some error message");
assert_eq!(x.contains(&2), false);
Run
🔬 This is a nightly-only experimental API. (result_contains_err #62358)

如果结果是包含给定值的 Err 值,则返回 true

Examples
#![feature(result_contains_err)]

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.contains_err(&"Some error message"), false);

let x: Result<u32, &str> = Err("Some error message");
assert_eq!(x.contains_err(&"Some error message"), true);

let x: Result<u32, &str> = Err("Some other error message");
assert_eq!(x.contains_err(&"Some error message"), false);
Run

Result<T, E> 转换为 Option<T>

self 转换为 Option<T>,使用 self,并丢弃错误 (如果有)。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.ok(), Some(2));

let x: Result<u32, &str> = Err("Nothing here");
assert_eq!(x.ok(), None);
Run

Result<T, E> 转换为 Option<E>

self 转换为 Option<E>,使用 self,并丢弃成功值 (如果有)。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.err(), None);

let x: Result<u32, &str> = Err("Nothing here");
assert_eq!(x.err(), Some("Nothing here"));
Run

&Result<T, E> 转换为 Result<&T, &E>

产生一个新的 Result,其中包含对原始引用的引用,并将原始保留在原处。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.as_ref(), Ok(&2));

let x: Result<u32, &str> = Err("Error");
assert_eq!(x.as_ref(), Err(&"Error"));
Run

&mut Result<T, E> 转换为 Result<&mut T, &mut E>

Examples

基本用法:

fn mutate(r: &mut Result<i32, i32>) {
    match r.as_mut() {
        Ok(v) => *v = 42,
        Err(e) => *e = 0,
    }
}

let mut x: Result<i32, i32> = Ok(2);
mutate(&mut x);
assert_eq!(x.unwrap(), 42);

let mut x: Result<i32, i32> = Err(13);
mutate(&mut x);
assert_eq!(x.unwrap_err(), 0);
Run

通过对包含的 Ok 值应用函数,将 Err 值 Maps 转换为 Result<U, E>,而保持 Err 值不变。

该函数可用于组合两个函数的结果。

Examples

在字符串的每一行上将数字乘以 2 来打印数字。

let line = "1\n2\n3\n4\n";

for num in line.lines() {
    match num.parse::<i32>().map(|i| i * 2) {
        Ok(n) => println!("{}", n),
        Err(..) => {}
    }
}
Run

返回提供的默认值 (如果 Err),或者将函数应用于包含的值 (如果 Ok),

传递给 map_or 的参数会被急切地评估; 如果要传递函数调用的结果,建议使用 map_or_else,它是延迟计算的。

Examples
let x: Result<_, &str> = Ok("foo");
assert_eq!(x.map_or(42, |v| v.len()), 3);

let x: Result<&str, _> = Err("bar");
assert_eq!(x.map_or(42, |v| v.len()), 42);
Run

通过将 fallback 函数 default 应用于包含的 Err 值,或将函数 f 应用于包含的 Ok 值,将 Result<T, E> 映射为 U

此函数可用于在处理错误时解压成功的结果。

Examples

基本用法:

let k = 21;

let x : Result<_, &str> = Ok("foo");
assert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);

let x : Result<&str, _> = Err("bar");
assert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
Run

通过对包含的 Err 值应用函数,将 Ok 值 Maps 转换为 Result<T, F>,而保持 Ok 值不变。

此函数可用于在处理错误时传递成功的结果。

Examples

基本用法:

fn stringify(x: u32) -> String { format!("error code: {}", x) }

let x: Result<u32, u32> = Ok(2);
assert_eq!(x.map_err(stringify), Ok(2));

let x: Result<u32, u32> = Err(13);
assert_eq!(x.map_err(stringify), Err("error code: 13".to_string()));
Run

返回可能包含的值的迭代器。

如果结果为 Result::Ok,则迭代器将产生一个值,否则将不产生任何值。

Examples

基本用法:

let x: Result<u32, &str> = Ok(7);
assert_eq!(x.iter().next(), Some(&7));

let x: Result<u32, &str> = Err("nothing!");
assert_eq!(x.iter().next(), None);
Run

返回可能包含的值的可变迭代器。

如果结果为 Result::Ok,则迭代器将产生一个值,否则将不产生任何值。

Examples

基本用法:

let mut x: Result<u32, &str> = Ok(7);
match x.iter_mut().next() {
    Some(v) => *v = 40,
    None => {},
}
assert_eq!(x, Ok(40));

let mut x: Result<u32, &str> = Err("nothing!");
assert_eq!(x.iter_mut().next(), None);
Run

如果结果为 Ok,则返回 res; 否则,返回 selfErr 值。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
let y: Result<&str, &str> = Err("late error");
assert_eq!(x.and(y), Err("late error"));

let x: Result<u32, &str> = Err("early error");
let y: Result<&str, &str> = Ok("foo");
assert_eq!(x.and(y), Err("early error"));

let x: Result<u32, &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<u32, &str> = Ok(2);
let y: Result<&str, &str> = Ok("different result type");
assert_eq!(x.and(y), Ok("different result type"));
Run

如果结果为 Ok,则调用 op,否则返回 selfErr 值。

该函数可用于基于 Result 值的控制流。

Examples

基本用法:

fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }
fn err(x: u32) -> Result<u32, u32> { 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));
Run

如果结果为 Err,则返回 res; 否则,返回 selfOk 值。

传递给 or 的参数会被急切地评估; 如果要传递函数调用的结果,建议使用 or_else,它是延迟计算的。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
let y: Result<u32, &str> = Err("late error");
assert_eq!(x.or(y), Ok(2));

let x: Result<u32, &str> = Err("early error");
let y: Result<u32, &str> = Ok(2);
assert_eq!(x.or(y), Ok(2));

let x: Result<u32, &str> = Err("not a 2");
let y: Result<u32, &str> = Err("late error");
assert_eq!(x.or(y), Err("late error"));

let x: Result<u32, &str> = Ok(2);
let y: Result<u32, &str> = Ok(100);
assert_eq!(x.or(y), Ok(2));
Run

如果结果为 Err,则调用 op,否则返回 selfOk 值。

该函数可用于基于结果值的控制流。

Examples

基本用法:

fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }
fn err(x: u32) -> Result<u32, u32> { 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));
Run

返回包含的 Ok 值或提供的默认值。

急切地评估传递给 unwrap_or 的参数; 如果要传递函数调用的结果,建议使用 unwrap_or_else,它是惰性求值的。

Examples

基本用法:

let default = 2;
let x: Result<u32, &str> = Ok(9);
assert_eq!(x.unwrap_or(default), 9);

let x: Result<u32, &str> = Err("error");
assert_eq!(x.unwrap_or(default), default);
Run

返回包含的 Ok 值或从闭包中计算得出。

Examples

基本用法:

fn count(x: &str) -> usize { x.len() }

assert_eq!(Ok(2).unwrap_or_else(count), 2);
assert_eq!(Err("foo").unwrap_or_else(count), 3);
Run

返回包含 self 值的包含的 Ok 值,而不检查该值是否不是 Err

Safety

Err 上调用此方法是 [undefined 行为]

Examples
let x: Result<u32, &str> = Ok(2);
assert_eq!(unsafe { x.unwrap_unchecked() }, 2);
Run
let x: Result<u32, &str> = Err("emergency failure");
unsafe { x.unwrap_unchecked(); } // 未定义的行为!
Run

返回包含 self 值的包含的 Err 值,而不检查该值是否不是 Ok

Safety

Ok 上调用此方法是 [undefined 行为]

Examples
let x: Result<u32, &str> = Ok(2);
unsafe { x.unwrap_err_unchecked() }; // 未定义的行为!
Run
let x: Result<u32, &str> = Err("emergency failure");
assert_eq!(unsafe { x.unwrap_err_unchecked() }, "emergency failure");
Run
🔬 This is a nightly-only experimental API. (result_copied #63168)

newly added

通过复制 Ok 部件的内容,将 Result<&T, E> 的 Maps 转换为 Result<T, E>

Examples
#![feature(result_copied)]
let val = 12;
let x: Result<&i32, i32> = Ok(&val);
assert_eq!(x, Ok(&12));
let copied = x.copied();
assert_eq!(copied, Ok(12));
Run
🔬 This is a nightly-only experimental API. (result_copied #63168)

newly added

通过复制 Ok 部件的内容,将 Result<&mut T, E> 的 Maps 转换为 Result<T, E>

Examples
#![feature(result_copied)]
let mut val = 12;
let x: Result<&mut i32, i32> = Ok(&mut val);
assert_eq!(x, Ok(&mut 12));
let copied = x.copied();
assert_eq!(copied, Ok(12));
Run
🔬 This is a nightly-only experimental API. (result_cloned #63168)

newly added

通过克隆 Ok 部分的内容,将 Result<&T, E> Maps 转换为 Result<T, E>

Examples
#![feature(result_cloned)]
let val = 12;
let x: Result<&i32, i32> = Ok(&val);
assert_eq!(x, Ok(&12));
let cloned = x.cloned();
assert_eq!(cloned, Ok(12));
Run
🔬 This is a nightly-only experimental API. (result_cloned #63168)

newly added

通过克隆 Ok 部分的内容,将 Result<&mut T, E> Maps 转换为 Result<T, E>

Examples
#![feature(result_cloned)]
let mut val = 12;
let x: Result<&mut i32, i32> = Ok(&mut val);
assert_eq!(x, Ok(&mut 12));
let cloned = x.cloned();
assert_eq!(cloned, Ok(12));
Run

返回包含 self 值的包含的 Ok 值。

Panics

如果值为 Err,就会出现 panics,其中 panic 消息包括传递的消息以及 Err 的内容。

Examples

基本用法:

let x: Result<u32, &str> = Err("emergency failure");
x.expect("Testing expect"); // `Testing expect: emergency failure` 的 panics
Run

返回包含 self 值的包含的 Ok 值。

由于此函数可能为 panic,因此通常不建议使用该函数。 相反,更喜欢使用模式匹配并显式处理 Err 大小写,或者调用 unwrap_orunwrap_or_elseunwrap_or_default

Panics

如果该值为 Err,就会出现 Panics,并由 Err 的值提供 panic 消息。

Examples

基本用法:

let x: Result<u32, &str> = Ok(2);
assert_eq!(x.unwrap(), 2);
Run
let x: Result<u32, &str> = Err("emergency failure");
x.unwrap(); // `emergency failure` 的 panics
Run

返回包含 self 值的包含的 Err 值。

Panics

如果值为 Ok,就会出现 panics,其中 panic 消息包括传递的消息以及 Ok 的内容。

Examples

基本用法:

let x: Result<u32, &str> = Ok(10);
x.expect_err("Testing expect_err"); // `Testing expect_err: 10` 的 panics
Run

返回包含 self 值的包含的 Err 值。

Panics

如果该值为 Ok,则会发生 panic,Ok 的值提供自定义 panic 消息。

Examples
let x: Result<u32, &str> = Ok(2);
x.unwrap_err(); // `2` 的 panics
Run
let x: Result<u32, &str> = Err("emergency failure");
assert_eq!(x.unwrap_err(), "emergency failure");
Run

返回包含的 Ok 值或默认值

然后使用 self 参数,如果 Ok,则返回包含的值,否则如果 Err,则返回该类型的默认值。

Examples

将字符串转换为整数,将格式不正确的字符串转换为 0 (整数的默认值)。 parse 将字符串转换为实现 FromStr 的任何其他类型,并在出错时返回 Err

let good_year_from_input = "1909";
let bad_year_from_input = "190blarg";
let good_year = good_year_from_input.parse().unwrap_or_default();
let bad_year = bad_year_from_input.parse().unwrap_or_default();

assert_eq!(1909, good_year);
assert_eq!(0, bad_year);
Run
🔬 This is a nightly-only experimental API. (unwrap_infallible #61695)

newly added

返回包含的 Ok 值,但不返回 panics。

unwrap 不同,已知该方法永远不会对其实现的结果类型进行 panic 的处理。 因此,它可以代替 unwrap 用作可维护性保护措施,如果以后将 Result 的错误类型更改为实际可能发生的错误,它将无法编译。

Examples

基本用法:


fn only_good_news() -> Result<String, !> {
    Ok("this is fine".into())
}

let s: String = only_good_news().into_ok();
println!("{}", s);
Run
🔬 This is a nightly-only experimental API. (unwrap_infallible #61695)

newly added

返回包含的 Err 值,但从不返回 panics。

unwrap_err 不同,已知此方法永远不会在其实现的结果类型上使用 panic。 因此,它可以代替 unwrap_err 用作可维护性保障,如果 Result 的 ok 类型稍后更改为实际可以发生的类型,则将无法编译。

Examples

基本用法:


fn only_bad_news() -> Result<!, String> {
    Err("Oops, it failed".into())
}

let error: String = only_bad_news().into_err();
println!("{}", error);
Run

Result<T, E> (或 &Result<T, E>) 转换为 Result<&<T as Deref>::Target, &E>

通过 Deref 强制转换原始 ResultOk 变体,并返回新的 Result

Examples
let x: Result<String, u32> = Ok("hello".to_string());
let y: Result<&str, &u32> = Ok("hello");
assert_eq!(x.as_deref(), y);

let x: Result<String, u32> = Err(42);
let y: Result<&str, &u32> = Err(&42);
assert_eq!(x.as_deref(), y);
Run

Result<T, E> (或 &mut Result<T, E>) 转换为 Result<&mut <T as DerefMut>::Target, &mut E>

通过 DerefMut 强制转换原始 ResultOk 变体,并返回新的 Result

Examples
let mut s = "HELLO".to_string();
let mut x: Result<String, u32> = Ok("hello".to_string());
let y: Result<&mut str, &mut u32> = Ok(&mut s);
assert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);

let mut i = 42;
let mut x: Result<String, u32> = Err(42);
let y: Result<&mut str, &mut u32> = Err(&mut i);
assert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
Run

OptionResult 转换为 ResultOption

Ok(None) 将映射到 NoneOk(Some(_))Err(_) 将映射到 Some(Ok(_))Some(Err(_))

Examples
#[derive(Debug, Eq, PartialEq)]
struct SomeErr;

let x: Result<Option<i32>, SomeErr> = Ok(Some(5));
let y: Option<Result<i32, SomeErr>> = Some(Ok(5));
assert_eq!(x.transpose(), y);
Run
🔬 This is a nightly-only experimental API. (result_flattening #70142)

Result<Result<T, E>, E> 转换为 Result<T, E>

Examples

基本用法:

#![feature(result_flattening)]
let x: Result<Result<&'static str, u32>, u32> = Ok(Ok("hello"));
assert_eq!(Ok("hello"), x.flatten());

let x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));
assert_eq!(Err(6), x.flatten());

let x: Result<Result<&'static str, u32>, u32> = Err(6);
assert_eq!(Err(6), x.flatten());
Run

展平一次只能删除一层嵌套:

#![feature(result_flattening)]
let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok("hello")));
assert_eq!(Ok(Ok("hello")), x.flatten());
assert_eq!(Ok("hello"), x.flatten().flatten());
Run
🔬 This is a nightly-only experimental API. (result_into_ok_or_err #82223)

newly added

如果 selfOk,则返回 Ok 值; 如果 selfErr,则返回 Err 值。

换句话说,此函数返回 Result<T, T> 的值 (T),而不管结果是 Ok 还是 Err

Atomic*::compare_exchangeslice::binary_search 等 API 结合使用时,此功能很有用,但仅在您不关心结果是否为 Ok 的情况下才有用。

Examples
#![feature(result_into_ok_or_err)]
let ok: Result<u32, u32> = Ok(3);
let err: Result<u32, u32> = Err(4);

assert_eq!(ok.into_ok_or_err(), 3);
assert_eq!(err.into_ok_or_err(), 4);
Run

Trait Implementations

返回值的副本。 Read more

source 执行复制分配。 Read more

使用给定的格式化程序格式化该值。 Read more

执行转换。

执行转换。

接受 Iterator 中的每个元素:如果它是 Err,则不再获取其他元素,并返回 Err。 如果没有发生 Err,则返回包含每个 Result 值的容器。

这是一个示例,该示例将递增 vector 中的的每个整数,并检查溢出:

let v = vec![1, 2];
let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
    x.checked_add(1).ok_or("Overflow!")
).collect();
assert_eq!(res, Ok(vec![2, 3]));
Run

这是另一个示例,尝试从另一个整数列表中减去一个,这次检查下溢:

let v = vec![1, 2, 0];
let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
    x.checked_sub(1).ok_or("Underflow!")
).collect();
assert_eq!(res, Err("Underflow!"));
Run

这是前一个示例的变体,显示在第一个 Err 之后不再从 iter 提取其他元素。

let v = vec![3, 2, 1, 10];
let mut shared = 0;
let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {
    shared += x;
    x.checked_sub(2).ok_or("Underflow!")
}).collect();
assert_eq!(res, Err("Underflow!"));
assert_eq!(shared, 6);
Run

由于第三个元素引起下溢,因此不再使用其他元素,因此 shared 的最终值为 6 (= 3 + 2 + 1),而不是 16。

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从兼容的 Residual 类型构造类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从兼容的 Residual 类型构造类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从兼容的 Residual 类型构造类型。 Read more

将该值输入给定的 HasherRead more

将这种类型的切片送入给定的 Hasher 中。 Read more

被迭代的元素的类型。

我们将其变成哪种迭代器?

从一个值创建一个迭代器。 Read more

被迭代的元素的类型。

我们将其变成哪种迭代器?

从一个值创建一个迭代器。 Read more

返回可能包含的值上的消耗迭代器。

如果结果为 Result::Ok,则迭代器将产生一个值,否则将不产生任何值。

Examples

基本用法:

let x: Result<u32, &str> = Ok(5);
let v: Vec<u32> = x.into_iter().collect();
assert_eq!(v, [5]);

let x: Result<u32, &str> = Err("nothing!");
let v: Vec<u32> = x.into_iter().collect();
assert_eq!(v, []);
Run

被迭代的元素的类型。

我们将其变成哪种迭代器?

此方法返回 selfother 之间的 OrderingRead more

比较并返回两个值中的最大值。 Read more

比较并返回两个值中的最小值。 Read more

将值限制在某个时间间隔内。 Read more

此方法测试 selfother 值是否相等,并由 == 使用。 Read more

此方法测试 !=

如果存在,则此方法返回 selfother 值之间的顺序。 Read more

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more

接受 Iterator 中的每个元素:如果它是 Err,则不再获取其他元素,并返回 Err。 如果没有发生 Err,则返回所有元素的乘积。

接受 Iterator 中的每个元素:如果它是 Err,则不再获取其他元素,并返回 Err。 如果没有发生 Err,则返回所有元素的总和。

Examples

这将对 vector 中的每个整数求和,如果遇到负元素,则拒绝求和:

let v = vec![1, 2];
let res: Result<i32, &'static str> = v.iter().map(|&x: &i32|
    if x < 0 { Err("Negative element found") }
    else { Ok(x) }
).sum();
assert_eq!(res, Ok(3));
Run
🔬 This is a nightly-only experimental API. (termination_trait_lib #43301)

被调用以获取值的表示形式作为状态码。 此状态代码返回到操作系统。 Read more

🔬 This is a nightly-only experimental API. (termination_trait_lib #43301)

被调用以获取值的表示形式作为状态码。 此状态代码返回到操作系统。 Read more

🔬 This is a nightly-only experimental API. (termination_trait_lib #43301)

被调用以获取值的表示形式作为状态码。 此状态代码返回到操作系统。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

当不短路时,? 产生的值的类型。

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

短路时作为 ? 的一部分传递给 FromResidual::from_residual 的值的类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从它的 Output 类型构造类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

? 来决定操作符是应该生成一个值 (因为它返回了 ControlFlow::Continue),还是将一个值传播回调用者 (因为它返回了 ControlFlow::Break)。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

获得所有权后的结果类型。

从借用的数据创建拥有的数据,通常是通过克隆。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。