MST

星途 面试题库

面试题:Rust位置参数错误检查与修复的高级应用

设计一个Rust库,库中有一个公共函数,接受可变数量的位置参数,这些参数类型均为`Box<dyn std::error::Error>`。函数需要对这些错误进行分类整理(例如按照错误类型分类),然后根据不同类型的错误进行不同的处理逻辑,最后返回一个统一的错误摘要(可以自定义一个合适的数据结构来表示)。要求使用泛型、trait对象等高级特性,同时要考虑错误处理的高效性和扩展性。请给出库的完整代码结构以及测试用例来验证功能。
21.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义错误摘要的数据结构
#[derive(Debug)]
struct ErrorSummary {
    error_types: std::collections::HashMap<String, Vec<String>>,
}

// 公共函数,接受可变数量的错误参数
pub fn classify_errors(errors: Vec<Box<dyn std::error::Error>>) -> ErrorSummary {
    let mut summary = ErrorSummary {
        error_types: std::collections::HashMap::new(),
    };

    for err in errors {
        let error_type = std::any::type_name::<dyn std::error::Error>(&*err);
        let error_message = err.to_string();
        summary.error_types.entry(error_type.to_string()).or_insert_with(Vec::new).push(error_message);
    }

    summary
}

// 测试用例
#[cfg(test)]
mod tests {
    use super::*;
    use std::error::Error;

    #[test]
    fn test_classify_errors() {
        let err1 = Box::<dyn Error>(Box::new(std::io::Error::new(std::io::ErrorKind::NotFound, "file not found")));
        let err2 = Box::<dyn Error>(Box::new(std::num::ParseIntError));
        let err3 = Box::<dyn Error>(Box::new(std::io::Error::new(std::io::ErrorKind::PermissionDenied, "permission denied")));

        let summary = classify_errors(vec![err1, err2, err3]);

        assert_eq!(summary.error_types.len(), 2);
        assert!(summary.error_types.contains_key("std::io::Error"));
        assert!(summary.error_types.contains_key("std::num::ParseIntError"));
    }
}