通过这篇文章来给 Rust 中的 ResultOption 这两个工具做个笔记,以加深对这两个重要工具的记忆和理解。

Result

Result 是一个用于处理错误的枚举类型,我们可以看看Rust中是怎么定义的:

1
2
3
4
enum Result<T, E> {
Ok(T),
Err(E),
}

Result 有两个成员 Ok(T)Err(E) 这里用到了泛型参数,在正常的情况下我们都是使用的Ok(T),程序中会把可能遇到出错的地方用Err(E)来进行处理。

这里我写了一个简单的例子:

hello函数有一个i32 类型的参数,通过判断n 是否大于 10 来决定函数返回的类型,正确时返回 Ok(T) ,不正确返回 Err(E)。这里ResultErr类型是 &‘static str类型,不能省略 'static

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fn main() {
match hello(11) {
Err(e) => println!("{}", e),
Ok(v) => println!("Value = {}", v),
}
}

fn hello(n: i32) -> Result<i32, &'static str> {
if n > 10 {
return Ok(n);
} else {
return Err("数值不能小于或等于 10");
}
}

Rust 官方的一个例子

这个例子定义了一个枚举类型Version成员有 Version1Version2。体现 Result 的地方在 parse_version()函数的返回类型处,正确时返回的类型为 Version 枚举。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[derive(Debug)]
enum Version {
Version1,
Version2,
}

fn parse_version(header: &[u8]) -> Result<Version, &'static str> {
match header.get(1) {
None => Err("invalid header length"),
Some(&1) => Ok(Version::Version1),
Some(&2) => Ok(Version::Version2),
Some(_) => Err("invalid version"),
}
}

fn main() {
let version = parse_version(&[1, 2, 3, 4]);

match version {
Ok(v) => println!("working with version: {:?}", v),
Err(e) => println!("error parsing header"),
}
}

io::Result

Rust 中对io操作提供了专用的 io::Result,定义如下:

1
pub type Result<T> = Result<T, Error>;

例子

1
2
3
4
5
6
7
8
9
use std::io;

fn get_string() -> io::Result<String> {
let mut buffer = String::new();

io::stdin().read_line(&mut buffer)?;

Ok(buffer)
}

?运算符

例子:官网链接:Result 与可恢复的错误 - Rust 程序设计语言 简体中文版 (kaisery.github.io)

1
2
3
4
5
6
7
8
9
10
11
12
13

fn main() {
match read_string_from_file() {
Ok(s) => println!("{}", s),
Err(e) => println!("Error: {}", e),
}
}

fn read_string_from_file() -> Result<String, io::Error> {
let mut s = String::new();
File::open("data2.txt")?.read_to_string(&mut s)?;
Ok(s)
}

Option<T> 枚举

相关文章:

【译】Rust 的 Result 类型基础 - 掘金 (juejin.cn)