#多态 #特质 #类型 #表示 #参考数据 #arc #rc

tupperware

为您的类型提供存储特质

2 个不稳定版本

0.2.0 2024 年 1 月 28 日
0.1.0 2024 年 1 月 25 日

#1046Rust 模式

MIT 许可证

9KB
90

特百惠

crate version docs

一个库,让您决定是否将您的类型放入 Box。它允许您表达关于数据存储的多态性。

说明

有时您有一个结构体,根据情况的不同,您希望以不同的方式存储数据。以下是一些例子

  • 您希望在存在支持多线程的功能的情况下,能够在 RcArc 之间切换,同时承担使用原子引用计数的成本。
  • 您希望在特定情况下存储数据的引用。

特百惠可以帮助您在这里,通过允许您使用类型系统在不同的数据存储变体之间切换。您可以为您的结构体定义编写语义,捕获每个字段应该包含什么数据,然后切换到您数据的不同存储表示。

用法

例如,您可以定义一个如下的结构体

use tupperware::{Storage, Inline};

type OrderId = i64;

#[derive(Debug, Clone)]
struct MyData<S: Storage = Inline> {
    name: S::Value<str>,
    orders: S::Value<[OrderId]>,
}

现在,根据 Storage 类型参数,您的值将以不同的方式存储。以下是结构体对于每种默认存储策略的存储方式

内联
#[derive(Debug, Clone)]
struct MyData {
    name: String,
    orders: Vec<OrderId>,
}
Box
#[derive(Debug, Clone)]
struct MyData {
    name: Box<str>,
    orders: Box<[OrderId]>,
}
Arc
#[derive(Debug, Clone)]
struct MyData {
    name: Arc<str>,
    orders: Arc<[OrderId]>,
}
Rc
#[derive(Debug, Clone)]
struct MyData {
    name: Rc<str>,
    orders: Rc<[OrderId]>,
}
Ref<'a>
#[derive(Debug, Clone)]
struct MyData {
    name: &'a str,
    orders: &'a [OrderId]>,
}

此示例显示了存储策略现在如何让您控制类型存储的方式。它允许您轻松地专门化存储机制,例如,如果启用某个功能,可以将 RcArc 交换

#[cfg(feature = "sync")]
pub type MyData = types::MyData<Arc>;
#[cfg(not(feature = "sync"))]
pub type MyData = types::MyData<Rc>;

使用此代码,您现在可以使用类型参数来控制类型存储的方式。默认设置为内联存储类型,但您有几个内置策略。以下是 str 使用不同策略映射的示例

您也可以通过实现 Storage 特质来定义自己的存储机制。

许可证

MIT,见 LICENSE.md

无运行时依赖