#refcell #nested #ref #no-alloc #refref #refmut

no-std nested-ref

指向一个或多个嵌套 RefCell 中包含的数据的引用

1 个不稳定版本

0.1.0 2023 年 5 月 13 日

#1973Rust 模式

MIT/Apache

29KB
459

nested-ref

指向嵌套 RefCell 中包含的数据的引用。

当借用一个自身包含在 RefCell 中的 RefCell 时,必须保留从任一 RefCell 获得的 Ref。可以使用 NestedRef 将这些嵌套的 Ref 组合在一起,达到任意嵌套级别。只有最内层的引用可以通过 NestedRef 上的 Deref 实现访问。

NestedRef 的接口与 Ref 相同,并增加了 NestedRef::map_refNestedRef::map_ref_mut 方法来获取对包含的 RefCell 的引用。

对于可变引用,有 NestedRefMut,就像 RefMutRef 一样。请注意,只有最内层的引用是可变的,外层的引用对于 NestedRefNestedRefMut 都是不可变的。因此,NestedRefMut 不能再嵌套;要获取嵌套的可变引用,创建一个 NestedRef 并使用 map_ref_mut

这个包与 no_std 兼容,并且不进行分配。

示例

use std::cell::RefCell;

use nested_ref::NestedRef;

let rc = RefCell::new(RefCell::new(0));
let nr = NestedRef::new(rc.borrow());
let mut nr = NestedRef::map_ref_mut(nr, RefCell::borrow_mut);
assert_eq!(*nr, 0);
*nr = 1;

假设您有一个包含在 RefCell 中的数据结构,其中每个条目也包含在 RefCell 中。 NestedRef 允许您返回对内部数据的引用,同时保留从两个 RefCell 中获得的 Ref

use std::cell::RefCell;

use generic_array::typenum::U1;
use nested_ref::{NestedRef, NestedRefMut};

struct MyVec<T> {
    inner: RefCell<Vec<RefCell<T>>>,
}

impl<T> MyVec<T> {
    fn get(&self, idx: usize) -> NestedRef<'_, T, U1> {
        let nr = NestedRef::new(self.inner.borrow());
        NestedRef::map_ref(nr, |r| r[idx].borrow())
    }

    fn get_mut(&self, idx: usize) -> NestedRefMut<'_, T, U1> {
        let nr = NestedRef::new(self.inner.borrow());
        NestedRef::map_ref_mut(nr, |r| r[idx].borrow_mut())
    }
}

许可证

根据您选择,许可协议为 MIT 许可证Apache 许可证 2.0 版

除非您明确表示,否则您提交给该软件包的任何贡献,根据 Apache-2.0 许可证的定义,将作为上述双重许可,不附加任何额外条款或条件。

依赖关系

~245KB