通过这篇文章来给  Rust 中的 Result 和 Option 这两个工具做个笔记,以加深对这两个重要工具的记忆和理解。
Result
Result 是一个用于处理错误的枚举类型,我们可以看看Rust中是怎么定义的:
| 12
 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。
| 12
 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 枚举。
| 12
 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>;
 | 
例子
| 12
 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)
| 12
 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)