1 个不稳定版本
0.1.0 | 2024 年 5 月 1 日 |
---|
#1869 在 Rust 模式
16KB
214 行
OwnedRefCell
OwnedRefCell
是 Rust 的 RefCell
的自定义实现,允许不同的借用机制。与 RefCell
不同,后者授予与借用作用域的生命周期相关的引用,OwnedRefCell
返回特殊的所有权引用。这些引用在其显式释放之前保持其借用状态,为在复杂或动态应用程序结构中管理生命周期提供了更大的灵活性。
此库中的主要类 OwnedRefCell<T>
提供了一个类似于 RefCell<T>
的接口,允许进行可变和不可变借用,并在运行时跟踪以确保没有值竞争。当您需要临时可变访问值结构中的值时,应使用 OwnedRefCell<T>
。与 RefCell
类似,此实现不是线程安全的;它不实现 Sync
。如果您需要线程安全的内部可变性,请考虑使用 Mutex
、RwLock
或 Atomic
类型。
特性
- 所有权引用:提供
OwnedRef
和OwnedRefMut
,它们在内部管理借用状态,并允许动态和灵活的生命周期。 - 安全借用:确保在运行时进行安全借用,防止数据竞争,并允许根据需要执行可变或不可变访问。
- 易于集成:设计为在
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文件。