4 个版本 (2 个破坏性更新)
使用旧的 Rust 2015
0.3.1 | 2018年2月27日 |
---|---|
0.3.0 | 2018年2月27日 |
0.2.0 | 2016年12月14日 |
0.1.1 | 2016年12月14日 |
在 Rust 模式 中排名第 912
每月下载量 157,635
在 14 个crate中使用(通过 foundationdb-macros)
10KB
151 行
try_map
更新:2018年2月20日 Rust 标准库将使用 transpose
来实现此功能,因此这个crate将逐渐被淘汰。跟踪问题在这里:https://github.com/rust-lang/rust/issues/47338
try_map
方法用于 Option
和 flip
方法用于 Option
和 Vec
。这些辅助方法允许在映射返回 Result
的函数时进行更直观的错误处理。
如何使用
添加到 Cargo.toml
[dependencies]
try_map = "0.3"
在您的代码中引入扩展特性:(FallibleMapExt
用于启用 try_map
,FlipResultExt
用于启用 flip
。)
use try_map::{FallibleMapExt, FlipResultExt};
像老板一样使用 try_map
和 flip
方法!
fn try_map_example() -> Result<Option<i32>, &'static str> {
let x = Some(42)
.try_map(|x| Ok(x + 1))?
.try_map(|x| Ok(x + 1))?
.try_map(|x| if true { Err("oh noes") } else { Ok(x + 1) })?
.try_map(|x| Ok(x + 1))?;
Ok(x)
}
assert_eq!(try_map_example(), Err("oh noes"));
fn flip_example() -> Result<Option<i32>, &'static str> {
let x = Some(42)
.map(|x| Ok(x + 1)).flip()?
.map(|x| Ok(x + 1)).flip()?
.map(|x| if true { Err("oh noes") } else { Ok(x + 1) }).flip()?
.map(|x| Ok(x + 1)).flip()?;
Ok(x)
}
assert_eq!(flip_example(), Err("oh noes"));
还有什么吗?
在 Rust RFC 存储库中有一个开放问题,建议将这些辅助方法引入标准库:https://github.com/rust-lang/rfcs/issues/1815 感谢 @killercup 提出在第三方 crate 中实现这些方法的建议。这样它们可以立即使用。(尽管如此,它们在标准库中仍然有用!)
看起来为了能够抽象提供 try_map
的特质以适用于不同类型的集合,我们需要支持高阶类型或关联类型构造函数。然而,似乎可以使用关联类型实现 flip
方法。