面试题答案
一键面试- 定义错误类型:
- 首先,为
Customer
和Product
分别定义错误类型。
// 定义Customer创建可能出现的错误 #[derive(Debug)] struct CustomerError { message: String, } // 定义Product创建可能出现的错误 #[derive(Debug)] struct ProductError { message: String, } // 定义Order创建可能出现的错误 #[derive(Debug)] enum OrderError { CustomerError(CustomerError), ProductError(ProductError), }
- 首先,为
- 定义子结构体:
- 以
Customer
和Product
为例,展示其创建时如何返回错误。
struct Customer { name: String, } impl Customer { fn new(name: Option<String>) -> Result<Self, CustomerError> { match name { Some(n) => Ok(Customer { name: n }), None => Err(CustomerError { message: "Missing necessary information for customer".to_string(), }), } } } struct Product { name: String, stock: u32, } impl Product { fn new(name: String, stock: u32) -> Result<Self, ProductError> { if stock == 0 { Err(ProductError { message: "Stock is insufficient".to_string(), }) } else { Ok(Product { name, stock }) } } }
- 以
- 定义
Order
结构体及其实例化函数:struct Order { customer: Customer, product: Product, } impl Order { fn new(customer_name: Option<String>, product_name: String, product_stock: u32) -> Result<Self, OrderError> { let customer = Customer::new(customer_name)?; let product = Product::new(product_name, product_stock)?; Ok(Order { customer, product }) } }
- 优化建议:
- 模块化:将错误类型定义、子结构体定义和
Order
结构体定义分别放在不同的模块中,这样可以使代码结构更清晰,提高可读性和可维护性。例如:- 创建
customer.rs
文件定义Customer
结构体及其错误类型和相关方法。 - 创建
product.rs
文件定义Product
结构体及其错误类型和相关方法。 - 在
main.rs
或order.rs
中定义Order
结构体及其实例化函数,并处理不同模块的导入。
- 创建
- 使用
thiserror
库:thiserror
库可以更方便地定义错误类型,减少样板代码。例如:
这样定义错误类型后,错误信息的生成和转换更加简洁和直观。use thiserror::Error; // 定义Customer创建可能出现的错误 #[derive(Error, Debug)] #[error("Missing necessary information for customer")] struct CustomerError; // 定义Product创建可能出现的错误 #[derive(Error, Debug)] #[error("Stock is insufficient")] struct ProductError; // 定义Order创建可能出现的错误 #[derive(Error, Debug)] enum OrderError { #[error("Customer error: {0}")] CustomerError(#[from] CustomerError), #[error("Product error: {0}")] ProductError(#[from] ProductError), }
- 模块化:将错误类型定义、子结构体定义和