MST

星途 面试题库

面试题:Rust中loop标签在多层异步循环中的深度应用

编写一段Rust异步代码,包含多层异步循环,在异步操作中使用loop标签。假设每个异步操作是模拟网络请求获取数据(可使用`async_std::task::sleep`模拟延迟),当获取到的数据满足某个复杂条件(例如数据的哈希值等于特定值)时,跳出所有异步循环,并整理已获取的数据形成一个特定格式的结果集返回。要求考虑异步错误处理以及合理使用`Future`、`async`和`await`关键字。
26.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use async_std::task;
use std::collections::HashMap;
use std::sync::Arc;
use async_std::sync::Mutex;
use std::hash::{Hash, Hasher};

// 模拟网络请求获取数据
async fn fetch_data() -> Result<String, String> {
    task::sleep(std::time::Duration::from_secs(1)).await;
    Ok("data".to_string())
}

// 计算哈希值
fn calculate_hash(data: &str) -> u64 {
    let mut hasher = std::collections::hash_map::DefaultHasher::new();
    data.hash(&mut hasher);
    hasher.finish()
}

#[async_std::main]
async fn main() -> Result<(), String> {
    let result_set = Arc::new(Mutex::new(HashMap::new()));
    let result_set_clone = result_set.clone();

    'outer_loop: loop {
        let data = match fetch_data().await {
            Ok(data) => data,
            Err(e) => {
                eprintln!("Error fetching data: {}", e);
                continue;
            }
        };

        let hash_value = calculate_hash(&data);
        if hash_value == 123456789 { // 特定哈希值
            let mut set = result_set_clone.lock().await;
            set.insert(data.clone(), hash_value);
            break 'outer_loop;
        } else {
            let mut set = result_set.lock().await;
            set.insert(data.clone(), hash_value);
        }

        'inner_loop: loop {
            let inner_data = match fetch_data().await {
                Ok(data) => data,
                Err(e) => {
                    eprintln!("Error fetching inner data: {}", e);
                    continue 'inner_loop;
                }
            };

            let inner_hash_value = calculate_hash(&inner_data);
            if inner_hash_value == 987654321 { // 另一个特定哈希值
                let mut set = result_set_clone.lock().await;
                set.insert(inner_data.clone(), inner_hash_value);
                break 'outer_loop;
            } else {
                let mut set = result_set.lock().await;
                set.insert(inner_data.clone(), inner_hash_value);
            }
        }
    }

    let final_result = result_set.lock().await;
    println!("Final Result Set: {:?}", final_result);
    Ok(())
}