面试题答案
一键面试use std::error::Error;
// 假设Data和ProcessedData结构体定义如下
struct Data;
struct ProcessedData;
// 假设FetchError和ProcessError结构体定义如下
struct FetchError;
struct ProcessError;
impl std::fmt::Debug for FetchError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "FetchError")
}
}
impl std::fmt::Debug for ProcessError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ProcessError")
}
}
impl std::error::Error for FetchError {}
impl std::error::Error for ProcessError {}
async fn async_fetch_data() -> Result<Data, FetchError> {
// 模拟数据获取操作
Ok(Data)
}
async fn async_process_data(data: Data) -> Result<ProcessedData, ProcessError> {
// 模拟数据处理操作
Ok(ProcessedData)
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let result = async_fetch_data()
.await
.and_then(|data| async_process_data(data).await)
.map_err(|e| match e {
FetchError => Box::new(e) as Box<dyn Error>,
ProcessError => Box::new(e) as Box<dyn Error>,
});
match result {
Ok(_) => println!("Data processed successfully"),
Err(e) => eprintln!("Error: {:?}", e),
}
Ok(())
}
在上述代码中:
- 定义了
Data
和ProcessedData
结构体分别表示获取的数据和处理后的数据。 - 定义了
FetchError
和ProcessError
结构体分别表示数据获取和处理过程中的错误。 async_fetch_data
和async_process_data
分别模拟数据获取和处理的异步操作。- 在
main
函数中,通过and_then
方法链式调用两个异步函数,并且使用map_err
处理不同类型的错误。 - 在实际应用中,资源释放通常由Rust的RAII机制自动处理,例如文件句柄、网络连接等,当相关变量离开作用域时,其析构函数会自动释放资源。对于更复杂的资源管理,
async_std::task::LocalSet
或tokio::task::JoinSet
等工具可以用于管理异步任务的生命周期,确保任务完成后资源得到正确释放。