面试题答案
一键面试// 定义自定义错误类型
#[derive(Debug)]
struct ProcessingError {
message: String,
}
impl std::fmt::Display for ProcessingError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Processing error: {}", self.message)
}
}
impl std::error::Error for ProcessingError {}
// 泛型函数
fn process_data<T, F, E>(data: T, f: F) -> Result<T, ProcessingError>
where
F: FnOnce(T) -> Result<T, E>,
E: std::fmt::Display,
{
f(data).map_err(|e| ProcessingError {
message: format!("Inner error: {}", e),
})
}
fn main() {
// 定义一个简单的闭包用于处理数据
let closure = |num: i32| {
if num < 0 {
Err("Negative numbers are not allowed")
} else {
Ok(num * 2)
}
};
let result = process_data(5, closure);
match result {
Ok(data) => println!("Processed data: {}", data),
Err(e) => eprintln!("Error: {}", e),
}
let result = process_data(-1, closure);
match result {
Ok(data) => println!("Processed data: {}", data),
Err(e) => eprintln!("Error: {}", e),
}
}
上述代码:
- 定义了
ProcessingError
自定义错误类型,并实现了std::fmt::Display
和std::error::Error
trait。 - 实现了
process_data
泛型函数,该函数接受一个数据和一个闭包,闭包对数据进行处理,并将闭包返回的错误转换为ProcessingError
。 - 在
main
函数中,展示了如何调用process_data
函数并处理可能返回的错误。