面试题答案
一键面试use std::fs::File;
use std::io::{self, Read};
// 定义自定义错误类型
#[derive(Debug)]
struct CustomError {
msg: String,
}
// 实现From trait,将标准库错误转换为自定义错误类型
impl From<io::Error> for CustomError {
fn from(err: io::Error) -> Self {
CustomError {
msg: err.to_string(),
}
}
}
fn read_file(filename: &str) -> Result<String, CustomError> {
let mut file = File::open(filename)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
?
操作符在这个过程中的作用:当File::open
或file.read_to_string
调用返回Err
时,?
操作符会将这个错误值自动转换为函数的返回类型Result<String, CustomError>
中的Err
值。如果这个错误类型实现了From
trait可以转换为CustomError
,那么?
操作符会调用From::from
方法进行转换,然后直接返回这个Err
值,终止函数执行。如果调用返回Ok
值,?
操作符会提取其中的值继续执行后续代码。这样可以大大简化错误处理代码,避免冗长的match
语句或手动处理错误返回值。