2 个版本
0.4.3 | 2022年2月8日 |
---|---|
0.4.2 | 2022年2月8日 |
0.4.1 |
|
#1015 in 并发
42KB
917 行
临时包
lib.rs
:
Archery
Archery 是一个 Rust 库,提供了一种在智能指针 Rc
和 Arc
上的抽象方法。这允许您创建指针类型可参数化的数据结构,因此当您不需要在线程之间共享数据时,可以避免 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