2 个版本
0.0.2 | 2021年9月5日 |
---|---|
0.0.1 | 2021年9月5日 |
727 在 数据结构 中排名
每月 338 次下载
在 cargo-playdate 中使用
27KB
355 行 代码
try-lazy-init
这是一个简单的 lazy-init
分支,增加了可失败的初始化功能,这是我无法通过包装器提供的。
安装
请使用 cargo-edit 来始终添加此库的最新版本
cargo add try-lazy-init
示例
use try_lazy_init::{Lazy, LazyTransform};
let lazy = Lazy::new();
assert_eq!(
// Not yet initialized, so this closure runs:
lazy.get_or_create(|| 1),
&1
);
assert_eq!(
// Already initialized so this closure doesn't run:
lazy.try_get_or_create(|| { unreachable!(); Err(()) }),
Ok(&1)
);
assert_eq!(lazy.get(), Some(&1));
assert_eq!(lazy.into_inner(), Some(1));
let lazy_transform = LazyTransform::new(1);
assert_eq!(
// Not yet initialized, so this closure runs:
lazy_transform.get_or_create(|x| x + 1),
&2
);
assert_eq!(
// Only available `where T: Clone`.
// Already initialized so this closure doesn't run:
lazy_transform.try_get_or_create(|_| { unreachable!(); Err(()) }),
Ok(&2)
);
assert_eq!(
// Available also without `where T: Clone`.
// Already initialized so this closure doesn't run:
lazy_transform.get_or_create_or_poison(|_| { unreachable!(); Err(()) }),
Ok(&2)
);
assert_eq!(lazy_transform.get(), Some(&2));
assert_eq!(lazy_transform.into_inner(), Ok(2));
let lazy_transform_2 = LazyTransform::<_, ()>::new(1);
assert_eq!(
// This poisons by error, which won't panic this method or `.try_into_inner`:
lazy_transform_2.get_or_create_or_poison(|_| Err(())),
Err(Some(()))
);
assert_eq!(
// The original value is now gone:
lazy_transform_2.try_into_inner(),
Err(None)
);
许可协议
截至 2021-09-05(即分支日期),lazy-init
的 Cargo.toml 中声明 license = "Apache-2.0/MIT"
,而 LICENSE 中只有 MIT 许可协议的文本。我保留了这种状况。
因此,在使用时请考虑此软件包为 MIT 许可,并在贡献时为 Apache-2.0/MIT 双重许可。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可协议定义,将按照上述方式双重许可,而无需任何附加条款或条件。
行为准则
变更日志
版本管理
try-lazy-init
严格遵循 语义版本控制 2.0.0,但有以下例外
- 在主要版本更改时,次要版本不会重置为 0(除 v1 之外)。
将其视为全局功能级别。 - 在主要版本或次要版本更改时,补丁版本不会重置为 0(除 v0.1 和 v1 之外)。
将其视为全局补丁级别。
这包括上述指定的 Rust 版本要求。
较早的 Rust 版本可能与当前版本兼容,但可能会随着次要或补丁版本的发布而发生变化。
受功能和补丁影响的具体版本可以从 CHANGELOG.md 中的相应标题确定。