1 个不稳定版本
0.1.0 | 2023 年 9 月 28 日 |
---|
#785 在 WebAssembly
10KB
190 行
retentive-lender
此 crate 提供了 retentive_lender::Lender
,它封装了 Rc<RefCell<T>>
以实现内部可变性模式。它还保留借用者的名称,直到值被丢弃,并在违反 Rust 的借用规则时显示借用者信息。
安装
cargo add retentive-lender
用法
use retentive_lender::Lender;
{
let data = Lender::new(1);
let borrow1 = data.borrow("borrow 1")?;
let borrow2 = data.borrow_mut("borrow 2");
assert!(borrow2, Err(r#"Failed to borrow mutable reference. Currently borrowed by: ["borrow 1"]"#.to_string()));
}
{
let data = Lender::new(1);
let borrow1 = data.borrow_mut("borrow 1")?;
let borrow2 = data.borrow("borrow 2");
assert!(borrow2, Err(r#"Failed to borrow immutable reference. Currently borrowed by: ["borrow 1 (mut)"]"#.to_string()));
}
{
let data = Lender::new(1);
let borrow1 = data.borrow("borrow 1")?;
let borrow2 = data.borrow("borrow 2")?;
let borrow3 = data.borrow_mut("borrow 3");
assert!(borrow3, Err(r#"Failed to borrow mutable reference. Currently borrowed by: ["borrow 1", "borrow 2"]"#.to_string()));
}
与 debug_cell
和 accountable-refcell
的比较
在开发这个库时,我发现了一个类似的库,名为 debug_cell
accountable-refcell
。它们是 RefCell
的薄包装,存储借用调用的回溯,并在 BorrowError / BorrowMutError 上显示回溯。
虽然这些库非常实用,但它们只在 RUST_BACKTRACE 定义时工作。这意味着我们必须配置构建以包含调试符号,这在某些情况下很麻烦,尤其是在 WebAssembly 上。
此外,retentive-lender
只提供有限的 API,用户不能直接访问 RefCell
,因此它永远不会崩溃。
许可证
MIT