#interior-mutability #lender #debugging #borrower #borrow #retentive

retentive-lender

带有调试信息的哑容器,适用于 WebAssembly

1 个不稳定版本

0.1.0 2023 年 9 月 28 日

#785WebAssembly

MIT 许可证

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_cellaccountable-refcell 的比较

在开发这个库时,我发现了一个类似的库,名为 debug_cell accountable-refcell。它们是 RefCell 的薄包装,存储借用调用的回溯,并在 BorrowError / BorrowMutError 上显示回溯。

虽然这些库非常实用,但它们只在 RUST_BACKTRACE 定义时工作。这意味着我们必须配置构建以包含调试符号,这在某些情况下很麻烦,尤其是在 WebAssembly 上。

此外,retentive-lender 只提供有限的 API,用户不能直接访问 RefCell,因此它永远不会崩溃。

许可证

MIT

无运行时依赖