#try #filter-map #result #macro #options

try_into_opt

类似于 try! 的宏,但将 Result 转换为 Option,主要用于 filter_map 中

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016 年 2 月 19 日

#2918Rust 模式

MIT/Apache

8KB

try_into_opt!

Travis Build Status Documentation Coverage Status crates.io MIT licensed Apache licensed

概述

类似于 try!,但将 Result 转换为 Option,主要用于 filter_map。提供类似于 try!map 中的错误早期返回。

try_into_opt!try_opt! 不同,后者为返回 Option 的函数提供早期返回。 try_into_opt 在返回 Result 的函数上操作,但你的代码需要一个选项。这种情况可能在执行可能失败的 IO 时出现,如果成功,则需要以某种方式进行过滤。

用法

将此添加到您的 Cargo.toml

[dependencies]
try_into_opt = "0.1.0"

并将其添加到您的包中

#[macro_use]
extern crate try_into_opt;

示例

#[macro_use]
extern crate try_into_opt;

const MAX_NUM: usize = 11usize;

fn num_range_filter(v: &[usize]) -> Result<Vec<usize>, String> {
    v.iter()
     .filter_map(|i| {
         let i = try_into_opt!(validate_num(*i));

         // do some filtering...
         if i == 5 {
             None
         } else {
             Some(Ok(i))
         }
     })
     .collect()
}

fn validate_num(i: usize) -> Result<usize, String> {
    if i > MAX_NUM {
        Err(format!("{} is larger than the allowed max of {}", i, MAX_NUM))
    } else {
        Ok(i)
    }
}

fn main() {
    let nums = num_range_filter(&[1, 2, 3, 10, 12, 0]);
    assert_eq!(nums.is_err(), true);

    let nums = num_range_filter(&[1, 2, 5, 3, 5, 10, 0, 5]).unwrap();
    assert_eq!(nums, [1, 2, 3, 10, 0]);
}

有关更多详细信息,请参阅 文档

许可

此库以与 Rust 相似的方式分发:MIT 许可证和 Apache 许可证(版本 2.0)的双重许可。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MITCOPYRIGHT

依赖项

~40KB