MST
星途 面试题库

面试题:Rust编译时与运行时错误处理的结合:自定义trait的生命周期与错误传播

定义一个自定义trait `MyTrait`,该trait有一个关联类型`Output`和一个方法`process`,`process`方法可能会返回不同类型的运行时错误。同时,这个trait的实现需要考虑到生命周期参数。编写一个结构体`MyStruct`实现`MyTrait`,并在另一个函数中调用`MyStruct`的`process`方法,处理编译时由于生命周期不匹配可能产生的错误,以及运行时`process`方法返回的错误。展示如何通过合理的设计,使得代码在编译时和运行时都能稳健地处理各种错误情况。
22.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fmt::{Debug, Display};
use std::error::Error;

// 定义自定义trait
pub trait MyTrait {
    type Output;
    fn process(&self) -> Result<Self::Output, MyError>;
}

// 定义错误类型
#[derive(Debug)]
pub enum MyError {
    // 这里可以定义不同类型的运行时错误
    SpecificError(String),
}

impl Display for MyError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            MyError::SpecificError(s) => write!(f, "Specific error: {}", s),
        }
    }
}

impl Error for MyError {}

// 定义结构体并实现MyTrait
pub struct MyStruct<'a> {
    data: &'a str,
}

impl<'a> MyTrait for MyStruct<'a> {
    type Output = &'a str;

    fn process(&self) -> Result<Self::Output, MyError> {
        // 模拟处理逻辑,这里简单返回data
        Ok(self.data)
    }
}

// 调用MyStruct的process方法并处理错误
pub fn call_process() -> Result<(), MyError> {
    let my_struct = MyStruct { data: "example" };
    let result = my_struct.process()?;
    println!("Process result: {}", result);
    Ok(())
}

call_process函数中,通过?操作符简洁地处理了process方法返回的Result类型,在编译时确保了生命周期匹配,在运行时能够处理process方法返回的错误。如果process方法返回错误,call_process函数也会返回错误,调用者可以进一步处理。