面试题答案
一键面试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
函数也会返回错误,调用者可以进一步处理。