面试题答案
一键面试use std::fs::File;
use std::io::{self, Read};
use std::result::Result;
// 假设的自定义解析错误类型
#[derive(Debug)]
struct ParseError;
// 假设的数据结构
struct MyStruct;
fn read_file() -> Result<String, io::Error> {
let mut file = File::open("example.txt")?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn parse_data(data: String) -> Result<MyStruct, ParseError> {
// 这里简单示例,实际应该有解析逻辑
if data.is_empty() {
Err(ParseError)
} else {
Ok(MyStruct)
}
}
fn main() {
let result = read_file()
.and_then(parse_data);
match result {
Ok(_) => println!("操作成功"),
Err(e) => println!("操作失败: {:?}", e),
}
}
在上述代码中:
read_file
函数使用?
操作符来传播io::Error
。如果打开文件或读取文件内容时出现错误,这个错误会直接传播到调用者。parse_data
函数接收read_file
返回的String
,同样使用?
操作符(在and_then
链式调用的上下文中)来传播ParseError
。- 使用
and_then
方法将read_file
和parse_data
两个操作连接起来。这样,如果read_file
返回Err
,就不会调用parse_data
,并且错误会直接传递到result
中。 - 最后通过
match
语句处理最终的Result
,打印操作成功或失败的信息。