MST

星途 面试题库

面试题:Rust Result枚举在链式操作中的运用

给定一系列操作,每个操作可能会返回一个Result枚举值。例如,你有一个函数`read_file`读取文件内容返回`Result<String, io::Error>`,另一个函数`parse_data`将字符串解析为特定数据结构返回`Result<MyStruct, ParseError>`。要求通过链式调用,将文件读取和数据解析操作连接起来,并正确处理每个步骤可能出现的错误,同时展示如何优雅地传播错误。
36.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::File;
use std::io::{self, Read};
use std::result::Result;

// 假设的自定义解析错误类型
#[derive(Debug)]
struct ParseError;

// 假设的数据结构
struct MyStruct;

fn read_file() -> Result<String, io::Error> {
    let mut file = File::open("example.txt")?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

fn parse_data(data: String) -> Result<MyStruct, ParseError> {
    // 这里简单示例,实际应该有解析逻辑
    if data.is_empty() {
        Err(ParseError)
    } else {
        Ok(MyStruct)
    }
}

fn main() {
    let result = read_file()
      .and_then(parse_data);
    match result {
        Ok(_) => println!("操作成功"),
        Err(e) => println!("操作失败: {:?}", e),
    }
}

在上述代码中:

  1. read_file函数使用?操作符来传播io::Error。如果打开文件或读取文件内容时出现错误,这个错误会直接传播到调用者。
  2. parse_data函数接收read_file返回的String,同样使用?操作符(在and_then链式调用的上下文中)来传播ParseError
  3. 使用and_then方法将read_fileparse_data两个操作连接起来。这样,如果read_file返回Err,就不会调用parse_data,并且错误会直接传递到result中。
  4. 最后通过match语句处理最终的Result,打印操作成功或失败的信息。