MST

星途 面试题库

面试题:Rust中函数指针与回调机制在异步编程中的深度融合

在Rust的异步编程环境下(使用`async - await`语法和`tokio`库),设计一个系统,其中一个异步任务需要根据另一个异步任务的执行结果动态选择不同的回调函数执行。请详细说明设计思路,并给出核心代码实现,同时阐述如何处理可能出现的异步错误。
31.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 任务与回调定义:首先定义两个异步任务,一个任务用于生成结果,另一个任务根据前一个任务的结果选择不同回调函数执行。
  2. 错误处理:在异步任务执行过程中,可能会出现各种错误,需要使用Result类型来处理这些错误,并在适当的地方进行unwrapexpect或者match来处理错误情况。
  3. 使用tokio运行时:利用tokio库提供的运行时环境来调度和执行异步任务。

核心代码实现

use tokio;

// 模拟第一个异步任务,返回一个i32结果
async fn task1() -> Result<i32, String> {
    // 模拟一些异步操作,这里简单返回一个值
    Ok(42)
}

// 回调函数1
fn callback1(result: i32) {
    println!("Callback 1 executed with result: {}", result);
}

// 回调函数2
fn callback2(result: i32) {
    println!("Callback 2 executed with result: {}", result);
}

// 第二个异步任务,根据task1的结果选择回调函数
async fn task2(result: Result<i32, String>) {
    match result {
        Ok(value) if value % 2 == 0 => callback1(value),
        Ok(_) => callback2(result.unwrap()),
        Err(e) => eprintln!("Error in task1: {}", e),
    }
}

#[tokio::main]
async fn main() {
    let result = task1().await;
    task2(result).await;
}

异步错误处理

  1. Result类型:在task1函数中,返回值类型为Result<i32, String>,其中Ok代表成功并携带结果,Err代表失败并携带错误信息。
  2. match处理:在task2函数中,通过match语句对task1的结果进行处理。如果是Ok,根据结果值选择不同的回调函数;如果是Err,则打印错误信息。
  3. 全局错误处理:在main函数中,也可以进一步对task1task2的错误进行更复杂的处理,例如记录日志、重试任务等。