MST

星途 面试题库

面试题:Rust自定义错误类型在泛型函数中的应用

编写一个泛型函数`process_data`,它接受一个泛型参数`T`和一个闭包。闭包对`T`进行处理,如果处理过程中出现错误,返回一个自定义的错误类型`ProcessingError`。请实现`ProcessingError`并在泛型函数中正确处理错误,同时展示如何调用这个泛型函数并处理可能返回的错误。
27.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义自定义错误类型
#[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),
    }
}

上述代码:

  1. 定义了ProcessingError自定义错误类型,并实现了std::fmt::Displaystd::error::Error trait。
  2. 实现了process_data泛型函数,该函数接受一个数据和一个闭包,闭包对数据进行处理,并将闭包返回的错误转换为ProcessingError
  3. main函数中,展示了如何调用process_data函数并处理可能返回的错误。