#self-referential #lifetime #borrowing #ownership #achieve

nolife

创建一个作用域并在未来访问时将其冻结的Crate

7个不稳定版本 (3个重大变更)

0.4.0 2024年4月19日
0.3.3 2024年1月6日
0.3.1 2023年11月26日
0.2.0 2022年12月27日
0.1.0 2022年11月1日

#368Rust模式

MIT/Apache

50KB
488

打开作用域并在未来访问时将其冻结。

License Crates.io Docs dependency status Build

此Crate允许构造包含引用的结构体,并在没有生命周期的情况下保持它们与引用数据的存活。

这对于零拷贝解析器特别有用,这些解析器构建复杂的(可能是昂贵的)表示形式,并借用源数据。

此Crate通过利用异步函数来实现这一点。在核心上,异步函数是自引用结构体。此Crate简单地提供了一种以受控方式将引用从异步函数外部泄露出来的方法。

使用此Crate

在您确定要访问的数据及其借用表示形式后,使用此Crate通常包括以下步骤

// Given the following types:
struct MyData(Vec<u8>);
struct MyParsedData<'a>(&'a mut MyData, /* ... */);

// 1. Define a helper type that will express where the lifetimes of the borrowed representation live.
struct MyParsedDataFamily; // empty type, no lifetime.
impl<'a> nolife::Family<'a> for MyParsedDataFamily {
    type Family = MyParsedData<'a>; // Indicates how the type is tied to the trait's lifetime.
    // you generally want to replace all lifetimes in the struct with the one of the trait.
}

// 2. Define a function that setups the data and its borrowed representation:
fn my_scope(
    data_source: Vec<u8>, // 👈 all parameters that allow to build a `MyData`
) -> impl nolife::TopScope<Family = MyParsedDataFamily> // 👈 use the helper type we declared
{
    nolife::scope!({
        let mut data = MyData(data_source);
        let mut parsed_data = MyParsedData(&mut data); // imagine that this step is costly...
        freeze_forever!(&mut parsed_data) // gives access to the parsed data to the outside.
                       /* 👆 reference to the borrowed data */
    })
}

// 3. Open a `BoxScope` using the previously written async function:
let mut scope = nolife::BoxScope::<MyParsedDataFamily>::new_dyn(my_scope(vec![0, 1, 2]));

// 4. Store the `BoxScope` anywhere you want
struct ContainsScope {
    scope: nolife::BoxScope<MyParsedDataFamily>,
    /* other data */
}

// 5. Lastly, enter the scope to retrieve access to the referenced value.
scope.enter(|parsed_data| { /* do what you need with the parsed data */ });

作用域类型

此Crate目前只提供一种类型的作用域

作用域 分配 打开后可移动 线程安全
BoxScope 1(包含的Future大小 + 1个指向引用类型的指针)

RcScopeMutexScope 可能是未来的扩展

许可证

根据您的选择,在Apache License,Version 2.0或MIT许可证下许可。

除非您明确表示,否则您有意提交以包含在此项目中的任何贡献,根据Apache-2.0许可证定义,应按照上述方式双重许可,不得有任何额外的条款或条件。

替代方案

yoke与这个Crate具有类似的使用场景,尽管它是通过自引用结构体而不是异步作用域来表达的,如果意图是借用一些数据,则这不太自然。

无运行时依赖