11 个版本 (4 个稳定版)
1.2.1 | 2024年8月13日 |
---|---|
1.2.0 | 2024年2月20日 |
1.1.0 | 2023年10月31日 |
1.0.0 | 2023年7月21日 |
0.2.1 | 2019年3月4日 |
#32 在 并发
每月下载量 272,649
用于 52 个 Crates (直接使用 4 个)
62KB
1K SLoC
archery
archery
是一个 Rust 库,它提供了一种抽象 Rc
和 Arc
智能指针的方法。这使得你可以创建指针类型可参数化的数据结构,因此在你不需要跨线程共享数据时,可以避免 Arc
的开销。
在支持 高阶多态 的语言中,这可以通过不使用任何库简单实现,但 Rust 还不支持这一点。为了模仿高阶多态,archery
实现了 Joshua Liebow-Feeser 在 “Rust 已经有高阶类型了… 好像是的” 中提出的方案。虽然存在其他方法,但它们似乎总是为用户提供较差的用户体验。
设置
要使用 archery
,请将以下内容添加到您的 Cargo.toml
[dependencies]
archery = "<version>"
使用 archery
archery
定义了一个 SharedPointer
,它接收一个 指针类型 作为类型参数。这为您提供了一个方便且用户体验良好的方法来抽象指针类型。
示例
声明一个数据结构,其指针类型作为类型参数,受 SharedPointerKind
的约束
use archery::*;
struct KeyValuePair<K, V, P: SharedPointerKind> {
pub key: SharedPointer<K, P>,
pub value: SharedPointer<V, P>,
}
impl<K, V, P: SharedPointerKind> KeyValuePair<K, V, P> {
fn new(key: K, value: V) -> KeyValuePair<K, V, P> {
KeyValuePair {
key: SharedPointer::new(key),
value: SharedPointer::new(value),
}
}
}
要使用它,只需插入您想要的指针类型
let pair: KeyValuePair<_, _, RcK> =
KeyValuePair::new("António Variações", 1944);
assert_eq!(*pair.value, 1944);
triomphe::Arc
您还可以使用 triomphe::Arc
作为 SharedPointer
的底层实现。这通常比 std::sync::Arc
快。阅读 triomphe
的 crate 文档 了解更多。
要使用它,您需要在 archery
中启用 triomphe
功能。在 SharedPointer
中使用 ArcTK
作为指针类型。
序列化
我们支持通过 serde 进行序列化。要使用它,启用 serde
功能。为此,将您的 Cargo.toml
中的 archery 依赖项更改为:
[dependencies]
archery = { version = "<version>", features = ["serde"] }
限制
目前,在 SharedPointer
内无法使用未指定大小类型。作为解决方案,您可以将未指定大小类型放入 Box
中。
替代方法
与 archery
采取的方法的替代方案是使用具有关联类型的 traits 来编码类型级别的函数。这已经被建议 多次,但提供了不美观的易用性(见 此处 和 此处)。
依赖关系
~200KB