2 个版本

0.4.3 2022年2月8日
0.4.2 2022年2月8日
0.4.1 2021年1月11日

#1015 in 并发

MPL-2.0 许可证

42KB
917

临时包


lib.rs:

Archery

Archery 是一个 Rust 库,提供了一种在智能指针 RcArc 上的抽象方法。这允许您创建指针类型可参数化的数据结构,因此当您不需要在线程之间共享数据时,可以避免 Arc 的开销。

在支持 高阶泛型 的语言中,这可以通过不使用任何库轻松实现,但 Rust 还不支持这一点。为了模仿高阶泛型,Archery 实现了 Joshua Liebow-Feeser 在 “Rust 已经有高阶类型了… sort of” 中提出的方法。虽然存在其他方法,但它们似乎总是为用户提供较差的易用性。

设置

要使用 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);

限制

目前,在 SharedPointer 中不能有未大小类型。作为替代方案,您可以将未大小类型放入 Box 中。

替代方法

与Archery采用的方法不同,可以使用具有关联类型的特性行编解码类型级别函数。这种方法已经被建议多次多次,但提供的美观性不好(参见这里这里)。

依赖项

~42KB