面试题答案
一键面试Result类型介绍
Result
类型是Rust标准库中用于处理可能成功或失败操作的枚举类型。它定义如下:
enum Result<T, E> {
Ok(T),
Err(E),
}
其中,T
代表操作成功时返回的值的类型,E
代表操作失败时返回的错误的类型。
如何用于错误处理
- 返回值处理:函数可以返回
Result
类型来表明操作是否成功。如果成功,返回Ok(T)
,其中T
是期望的返回值;如果失败,返回Err(E)
,其中E
是错误信息。 - 模式匹配:使用模式匹配来处理
Result
。例如:
let result: Result<i32, &str> = Ok(42);
match result {
Ok(value) => println!("成功,值为: {}", value),
Err(error) => println!("失败,错误: {}", error),
}
- 传播错误:使用
?
运算符来方便地传播错误。如果Result
是Err
,?
会提前返回错误,将错误传播到调用者。例如:
fn divide(a: i32, b: i32) -> Result<i32, &str> {
if b == 0 {
Err("除数不能为零")
} else {
Ok(a / b)
}
}
fn calculate() -> Result<i32, &str> {
let result1 = divide(10, 2)?;
let result2 = divide(result1, 5)?;
Ok(result2)
}
简单示例
假设我们有一个从文件中读取整数的函数。
use std::fs::File;
use std::io::{self, Read};
fn read_number_from_file(file_path: &str) -> Result<i32, io::Error> {
let mut file = File::open(file_path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
content.trim().parse::<i32>().map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
}
在这个示例中,read_number_from_file
函数可能因为文件打开失败、读取失败或解析失败而返回错误。调用者可以使用模式匹配或?
运算符来处理这些潜在的错误。
fn main() {
match read_number_from_file("test.txt") {
Ok(number) => println!("从文件中读取的数字: {}", number),
Err(error) => println!("读取文件时出错: {}", error),
}
}