MST

星途 面试题库

面试题:Rust中Option与Result在复杂业务逻辑中的应用

在一个文件系统操作的Rust项目中,需要读取一个配置文件,解析其中的某些设置。假设读取文件函数返回`Result<String, io::Error>`,解析配置函数接收`String`并返回`Result<Config, ParseError>`(`Config`是自定义配置结构体,`ParseError`是自定义解析错误类型)。如果配置文件不存在,需要使用默认配置。请使用`Option`和`Result`结合的方式,优雅地实现这个逻辑,并说明在这种复杂业务场景下,如何处理不同类型错误以及如何保证代码的可读性和可维护性。
16.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::read_to_string;
use std::io;

// 假设的自定义配置结构体和解析错误类型
struct Config;
struct ParseError;

fn read_config() -> Result<Config, ParseError> {
    let content = match read_to_string("config.txt") {
        Ok(content) => content,
        Err(e) if e.kind() == io::ErrorKind::NotFound => return Ok(Config::default()),
        Err(e) => return Err(ParseError),
    };

    parse_config(content)
}

fn parse_config(content: String) -> Result<Config, ParseError> {
    // 这里假设解析逻辑,返回Config或ParseError
    Ok(Config)
}

impl Default for Config {
    fn default() -> Self {
        Config
    }
}

错误处理

  1. 文件读取错误:如果文件不存在,直接返回默认配置。对于其他文件读取错误,将其转换为解析错误(这里简单处理为返回ParseError,实际可根据业务细化)。
  2. 解析错误:由parse_config函数返回的ParseError直接传递给调用者,调用者可根据该错误类型进行相应处理。

代码可读性和可维护性

  1. 模块化:将文件读取和配置解析分离为不同的函数,每个函数专注于单一职责,提高代码的可读性和可维护性。
  2. 模式匹配:使用match语句处理Result类型,使错误处理逻辑清晰明了。对于不同类型的错误可以针对性处理,如文件不存在的情况。
  3. 错误类型自定义:定义自定义的ParseError,可以更精确地表达配置解析过程中可能出现的错误,便于调用者区分和处理不同类型的错误。同时Default trait的实现,使得获取默认配置的逻辑简单直观。