MST

星途 面试题库

面试题:Rust trait错误处理机制在泛型中的应用

定义一个泛型结构体 `ResultContainer<T>`,其中 `T` 实现了一个包含可能出错方法的trait `Processable`。要求在 `ResultContainer` 的方法 `process_all` 中统一处理 `Processable` trait方法执行时可能出现的错误,并且通过合适的方式将错误返回给调用者。请详细描述设计思路并给出完整代码。
35.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 首先定义 Processable trait,其中包含一个可能出错的方法。
  2. 接着定义泛型结构体 ResultContainer<T>T 需要实现 Processable trait。
  3. ResultContainer 结构体中定义 process_all 方法,该方法调用 T 实现的 Processable trait 方法,并统一处理可能出现的错误,最后将错误返回给调用者。

代码示例(以Rust语言为例)

// 定义Processable trait
trait Processable {
    type Error;
    fn process(&self) -> Result<(), Self::Error>;
}

// 定义泛型结构体ResultContainer
struct ResultContainer<T> where T: Processable {
    data: T,
}

impl<T> ResultContainer<T> where T: Processable {
    // 构造函数
    fn new(data: T) -> Self {
        ResultContainer { data }
    }

    // process_all方法,统一处理错误并返回
    fn process_all(&self) -> Result<(), T::Error> {
        self.data.process()
    }
}

// 示例实现Processable trait
struct Example {
    value: i32,
}

impl Processable for Example {
    type Error = String;

    fn process(&self) -> Result<(), Self::Error> {
        if self.value < 0 {
            Err("Value is negative".to_string())
        } else {
            Ok(())
        }
    }
}

fn main() {
    let example1 = Example { value: 5 };
    let container1 = ResultContainer::new(example1);
    match container1.process_all() {
        Ok(()) => println!("Processed successfully"),
        Err(e) => println!("Error: {}", e),
    }

    let example2 = Example { value: -1 };
    let container2 = ResultContainer::new(example2);
    match container2.process_all() {
        Ok(()) => println!("Processed successfully"),
        Err(e) => println!("Error: {}", e),
    }
}