通过这篇文章来给 Rust
中的 Result
和 Option
这两个工具做个笔记,以加深对这两个重要工具的记忆和理解。
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)
。这里Result
的Err
类型是 &‘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
成员有 Version1
和Version2
。体现 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)