当前位置: 首页 > 编程笔记 >

Rust 通用结果方法

苏高旻
2023-03-14
本文向大家介绍Rust 通用结果方法,包括了Rust 通用结果方法的使用技巧和注意事项,需要的朋友参考一下

示例

use std::io::{Read, Result as IoResult};
use std::fs::File;

struct Config(u8);

fn read_config() -> IoResult<String> {
    let mut s = String::new();
    let mut file = File::open(&get_local_config_path())
        // 如果Result为Err,则调用or_else闭包。
        .or_else(|_| File::open(&get_global_config_path()))?;
    // 注意:在`or_else`中,闭包应该返回带有匹配项的Result
    //       确定类型,而在`and_then`中,返回的Result应该有一个
    //       匹配的Err类型。
    let _ = file.read_to_string(&mut s)?;
    Ok(s)
}

struct ParseError;

fn parse_config(conf_str: String) -> Result<Config, ParseError> {
    // 解析配置字符串...
    if conf_str.starts_with("bananas") {
        Err(ParseError)
    } else {
        Ok(Config(42))
    }
}

fn run() -> Result<(), String> {
    //注意:此函数的错误类型为字符串。我们使用下面的map_err
    //       将错误值转换为String类型
    let conf_str = read_config()
        .map_err(|e| format!("Failed to read config file: {}", e))?;
    // 注意:我们可以使用`and_then`来包装let而不是上面的`?`。
    //       表达式如下。
    let conf_val = parse_config(conf_str)
        .map(|Config(v)| v / 2) // map可用于仅映射Ok值
        .map_err(|_| "无法解析配置字符串!".to_string())?;

    // 跑...

    Ok(())
}

fn main() {
    match run() {
        Ok(_) => println!("Bye!"),
        Err(e) => println!("Error: {}", e),
    }
}

fn get_local_config_path() -> String {
    let user_config_prefix = "/home/user/.config";
    // 获取用户配置目录的代码
    format!("{}/my_app.rc", user_config_prefix)
}

fn get_global_config_path() -> String {
    let global_config_prefix = "/etc";
    // 获取全局配置目录的代码
    format!("{}/my_app.rc", global_config_prefix)
}

如果配置文件不存在,则输出:

Error: Failed to read config file: No such file or directory (os error 2)

如果解析失败,则输出:

Error: 无法解析配置字符串!

注意:随着项目的发展,使用这些基本方法(文档)来处理错误会很麻烦,而又不会丢失有关错误的来源和传播路径的信息。同样,过早地将错误转换为字符串以处理多种错误类型绝对是一个坏习惯,如上所述。更好的方法是使用板条箱error-chain。

 类似资料:
  • 我使用的是JMockit1.1,我所要做的就是调用一个私有方法并测试返回值。然而,我很难从JMockit去封装示例中准确理解如何做到这一点。

  • 本文向大家介绍Rust 结构域,包括了Rust 结构域的使用技巧和注意事项,需要的朋友参考一下 示例 这指定任何给定的实例Struct具有生命周期'a,并且&u32存储在x中的生命周期必须至少为'a。

  • 现在我想实现的是: 如何组合来自UserFlux的响应,并使用类似group.addUsers(userfromFlux)的内容将这些用户与该组关联起来。 有人能帮助如何组合来自userFlux和GroupMono的结果吗。我想我使用了像Zip这样的东西,但它会从源代码进行一对一的映射。在我的例子中,我需要做1到N映射。这里我有一个组,但多个用户,我需要添加到该组。返回,然后将zip运算符与mon

  • 本文向大家介绍Rust 如果让/而让,包括了Rust 如果让/而让的使用技巧和注意事项,需要的朋友参考一下 示例 if let 组合模式match和if语句,并允许进行简短的非详尽匹配。 这等效于: 这些块也可以具有else语句。 此块等效于: while let 组合模式匹配和while循环。 打印H+e+l+l+o+,+ +w+o+r+l+d+!+。 等效于使用loop {}和match语句:

  • 我试图遵循下面的示例:https://rust-lang-nursery.github.io/rust-cookbook/web/scraping.html,它同时使用Reqwest和Select来获取html响应,然后解析数据。 我使用的是Reqwest Version0.10.4并选择Version0.4.3,这就是它在示例中显示的版本。然而,我得到了一个错误: 似乎from_read方法接受

  • 问题内容: 我要找的东西对我来说似乎很简单,但是我的Google失败了。 我想要一个允许我运行任何查询并以json格式获取结果的方法。 诀窍是我 不 希望结果需要Java对象作为过程的一部分(DTO,VO等)。 有任何快速/简便/清洁的方法吗? 问题答案: 杰克逊有一些不错的方法。此答案中有一些示例可以为您带来奇迹。 另外,如果杰克逊不提供给你,你可以看看这个