2 个不稳定版本
0.2.0 | 2024 年 1 月 28 日 |
---|---|
0.1.0 | 2024 年 1 月 25 日 |
#1046 在 Rust 模式
9KB
90 行
特百惠
一个库,让您决定是否将您的类型放入 Box
。它允许您表达关于数据存储的多态性。
说明
有时您有一个结构体,根据情况的不同,您希望以不同的方式存储数据。以下是一些例子
- 您希望在存在支持多线程的功能的情况下,能够在
Rc
和Arc
之间切换,同时承担使用原子引用计数的成本。 - 您希望在特定情况下存储数据的引用。
特百惠可以帮助您在这里,通过允许您使用类型系统在不同的数据存储变体之间切换。您可以为您的结构体定义编写语义,捕获每个字段应该包含什么数据,然后切换到您数据的不同存储表示。
用法
例如,您可以定义一个如下的结构体
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]>,
}
此示例显示了存储策略现在如何让您控制类型存储的方式。它允许您轻松地专门化存储机制,例如,如果启用某个功能,可以将 Rc
与 Arc
交换
#[cfg(feature = "sync")]
pub type MyData = types::MyData<Arc>;
#[cfg(not(feature = "sync"))]
pub type MyData = types::MyData<Rc>;
使用此代码,您现在可以使用类型参数来控制类型存储的方式。默认设置为内联存储类型,但您有几个内置策略。以下是 str
使用不同策略映射的示例
您也可以通过实现 Storage
特质来定义自己的存储机制。
许可证
MIT,见 LICENSE.md。