2 个版本
| 0.1.1 | 2022 年 7 月 12 日 |
|---|---|
| 0.1.0 | 2022 年 1 月 16 日 |
| 0.0.2 |
|
| 0.0.1 |
|
| 0.0.0 |
|
#1023 in Rust 模式
98KB
1.5K SLoC
概述
Outcome<S, M, F> 是 Rust 标准库中找到的 Result 类型的增强。
它是一个枚举,具有以下变体
Success(S),表示成功并包含一个值Mistake(M),表示一个可选的 可重试错误 并包含一个值Failure(F),表示失败并包含一个值。
enum Outcome<S, M, F> {
Success(S),
Mistake(M),
Failure(F),
}
Outcome 是 Result 的一个 增强。它向 "成功或失败" 的二分法添加了第三个状态,这是 Result<T, E> 模型所不具备的。这个第三个状态是 软 或 可重试 错误的状态。一个 可重试 错误是指由于其他操作(例如,磁盘读写未完成)、配置错误(例如,在调用函数之前忘记设置特定标志)或忙碌的资源(例如,尝试锁定音频、视频或数据库资源)而导致操作可能没有成功。
use outcome::prelude::*;
#[derive(Debug, PartialEq)]
enum Version { V1, V2 }
#[derive(Debug, PartialEq)]
struct EmptyInput;
fn parse_version(header: &[u8]) -> Outcome<Version, EmptyInput, &'static str> {
match header.get(0) {
None => Mistake(EmptyInput),
Some(&1) => Success(Version::V1),
Some(&2) => Success(Version::V2),
Some(_) => Failure("invalid or unknown version"),
}
}
let version = parse_version(&[]);
assert_eq!(version, Mistake(EmptyInput));
用法
目前,在crates.io上已经有人使用了名称outcome。由于crates.io目前不支持命名空间或集合,我们不得不采取一种独特的方法来发布这个crate。为此,我们通过python生成了一个UUIDv5字符串。
from uuid import *
print(uuid5(uuid5(NAMESPACE_DNS, "occult.work"), "outcome"))
这将生成字符串46f94afc-026f-5511-9d7e-7d1fd495fb5c。因此,您的Cargo.toml中的依赖项将看起来像这样
[dependencies]
outcome-46f94afc-026f-5511-9d7e-7d1fd495fb5c = "*"
然而,导出的库名称仍然是outcome,因此导入它的处理方式相同
use outcome::prelude::*;
用户也可以通过在他们的依赖声明中使用package键来解决这个问题
[dependencies.outcome]
version = "*"
package = "outcome-46f94afc-026f-5511-9d7e-7d1fd495fb5c"
这个解决方案对用户友好吗?不,但crates.io上的命名空间缺失和域名抢注政策也同样不友好。如果/当这个问题得到解决时,这个crate的文档(和名称!)将被更改,所有版本都将被撤回。
依赖项
~0-285KB