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