#可出错 #映射 #结果 #错误处理 #选项

fallible_map

为对 Option 和迭代器使用返回 Result 的函数进行可出错映射提供实用工具

2 个版本

0.1.1 2024年7月10日
0.1.0 2024年7月8日

#770Rust 模式

Download history 107/week @ 2024-07-03 201/week @ 2024-07-10 52/week @ 2024-07-17 77/week @ 2024-07-24 61/week @ 2024-07-31 29/week @ 2024-08-07

每月下载量 232

MIT 许可协议

11KB
93

可出错映射

Crates.io License: MIT Version Repository Homepage

fallible_map 提供了在 Option 类型和迭代器上执行可出错映射操作的实用工具,允许使用可以返回 Result 的函数。

该库包括用于增强 OptionIterator 类型并带有处理可出错操作方法的特质的特性。

概述

该包为可选值和迭代器提供扩展,以执行可出错映射操作,返回在计算过程中正确反映潜在错误的结果。

这些扩展在需要错误处理的操作可能失败的情况下非常有用。

特性

  • ExtractOption 特质:一个辅助特质,用于提取可选容器内的内部值;
  • FallibleMapExt 特质:扩展 Option,增加了用于可出错操作的函数,如 try_maptry_unwrap_ortry_and_then
  • FallibleMapIteratorExt 特质:扩展迭代器以具有 try_map 方法,允许在迭代过程中使用返回 Result 的函数,提供用于无缝链式和收集的迭代器适配器。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
fallible_map = "^0.1"

用法

示例

使用 FallibleMapExt 和 Option

use fallible_map::FallibleMapExt;

fn main() -> Result<(), String> {
    let some_number: Option<i32> = Some(2);

    let result: Result<Option<i32>, String> = some_number.try_map(|num| {
        if num % 2 == 0 {
            Ok(num * 2)
        } else {
            Err("Odd number".to_string())
        }
    });

    assert_eq!(result, Ok(Some(4)));

    Ok(())
}

使用 FallibleMapExt 和 try_and_then

use fallible_map::FallibleMapExt;

fn main() -> Result<(), String> {
    let some_number: Option<i32> = Some(2);

    let result: Result<Option<i32>, String> = some_number.try_and_then(|num| {
        if num % 2 == 0 {
            Ok(Some(num * 2))
        } else {
            Err("Odd number".to_string())
        }
    });

    assert_eq!(result, Ok(Some(4)));

    let none_number: Option<i32> = None;

    let result = none_number.try_and_then(|num| {
        if num % 2 == 0 {
            Ok(Some(num * 2))
        } else {
            Err("Odd number".to_string())
        }
    });

    assert_eq!(result, Ok(None));

    Ok(())
}

使用 FallibleMapIteratorExt 和 Iterator

use fallible_map::FallibleMapIteratorExt;

fn main() -> Result<(), String> {
    let numbers = vec![1, 2, 3, 4, 5];

    let mapped_numbers: Result<Vec<i32>, String> = numbers.into_iter().try_map(|x| {
        if x % 2 == 0 {
            Ok(x * 2)
        } else {
            Err(format!("Failed to process {}", x))
        }
    }).collect();

    match mapped_numbers {
        Ok(nums) => println!("Mapped successfully: {:?}", nums),
        Err(e) => println!("Error occurred: {}", e),
    }

    Ok(())
}

许可协议

本项目采用 MIT 许可协议。有关详细信息,请参阅 LICENSE 文件。

贡献

欢迎贡献!请随时提交拉取请求、打开问题或提出功能和改进建议。

无运行时依赖