#reference #refcell #owned #borrowing #lifetime #management #applications

owned_ref_cell

Rust 库提供了一种自定义的 RefCell 变体,具有所有权的引用,以实现灵活和动态的借用管理

1 个不稳定版本

0.1.0 2024 年 5 月 1 日

#1869Rust 模式

MIT 许可证

16KB
214

OwnedRefCell

OwnedRefCell 是 Rust 的 RefCell 的自定义实现,允许不同的借用机制。与 RefCell 不同,后者授予与借用作用域的生命周期相关的引用,OwnedRefCell 返回特殊的所有权引用。这些引用在其显式释放之前保持其借用状态,为在复杂或动态应用程序结构中管理生命周期提供了更大的灵活性。

Tests Lints Docs codecov

此库中的主要类 OwnedRefCell<T> 提供了一个类似于 RefCell<T> 的接口,允许进行可变和不可变借用,并在运行时跟踪以确保没有值竞争。当您需要临时可变访问值结构中的值时,应使用 OwnedRefCell<T>。与 RefCell 类似,此实现不是线程安全的;它不实现 Sync。如果您需要线程安全的内部可变性,请考虑使用 MutexRwLockAtomic 类型。

特性

  • 所有权引用:提供 OwnedRefOwnedRefMut,它们在内部管理借用状态,并允许动态和灵活的生命周期。
  • 安全借用:确保在运行时进行安全借用,防止数据竞争,并允许根据需要执行可变或不可变访问。
  • 易于集成:设计为在 RefCell 的生命周期管理过于限制时使用的直接替换方案。

入门

请确保您的机器上已安装 Rust。如果没有,您可以按照 官方 Rust 网站 上的说明安装 Rust。

安装

通过在您的 Cargo.toml 依赖关系中包含它来将 OwnedRefCell 添加到您的 Rust 项目中

[dependencies]
owned_ref_cell = { git = "https://github.com/snormore/owned_ref_cell.git" }

使用

以下是一个如何使用 OwnedRefCell 的简单示例

use owned_ref_cell::OwnedRefCell;
use std::collections::HashMap;

fn main() {
    let shared_map = OwnedRefCell::new(HashMap::new());

    // Create a new block to limit the scope of the dynamic borrow
    {
        let mut map = shared_map.borrow_mut();
        map.insert("green", 92388);
        map.insert("blue", 11837);
        map.insert("red", 11826);
        map.insert("yellow", 38);
    }

    // Note that if we had not let the previous borrow of the cache fall out
    // of scope then the subsequent borrow would cause a dynamic thread panic.
    // This is the major hazard of using `OwnedRefCell`.
    let total: i32 = shared_map.borrow().values().sum();
    assert_eq!(total, 116089);

    // Note that the `OwnedRefMut` outlives the scoped borrow, which would not
    // compile as a `RefMut` when using `RefCell`.
    let map_ref = {
        let mut map = shared_map.borrow_mut();
        map.insert("purple", 1);
        map
    };
    let total: i32 = map_ref.values().sum();
    assert_eq!(total, 116090);
}

文档

查找更详细的文档,请点击这里,或者运行以下命令生成文档并在浏览器中查看

cargo doc --open

贡献

欢迎贡献!请随时提交拉取请求,创建问题报告来报告错误和功能请求,并帮助改进文档。

支持

如果您遇到任何问题或需要帮助,请在GitHub仓库中提交问题

许可

本项目采用MIT许可证 - 详细信息请参阅LICENSE文件。

无运行时依赖