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并发

Download history 57848/week @ 2024-05-02 62316/week @ 2024-05-09 57972/week @ 2024-05-16 61382/week @ 2024-05-23 55798/week @ 2024-05-30 47735/week @ 2024-06-06 58732/week @ 2024-06-13 52055/week @ 2024-06-20 53328/week @ 2024-06-27 42503/week @ 2024-07-04 54122/week @ 2024-07-11 68107/week @ 2024-07-18 70652/week @ 2024-07-25 73478/week @ 2024-08-01 67400/week @ 2024-08-08 48002/week @ 2024-08-15

每月下载量 272,649
用于 52 个 Crates (直接使用 4 个)

MPL-2.0 许可证

62KB
1K SLoC

Build Status Code Coverage Dependency status crates.io Downloads Github stars Documentation License

archery

archery 是一个 Rust 库,它提供了一种抽象 RcArc 智能指针的方法。这使得你可以创建指针类型可参数化的数据结构,因此在你不需要跨线程共享数据时,可以避免 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