1 个不稳定版本
0.1.0 | 2023 年 5 月 13 日 |
---|
#1973 在 Rust 模式
29KB
459 行
nested-ref
指向嵌套 RefCell
中包含的数据的引用。
当借用一个自身包含在 RefCell
中的 RefCell
时,必须保留从任一 RefCell
获得的 Ref
。可以使用 NestedRef
将这些嵌套的 Ref
组合在一起,达到任意嵌套级别。只有最内层的引用可以通过 NestedRef
上的 Deref
实现访问。
NestedRef
的接口与 Ref
相同,并增加了 NestedRef::map_ref
和 NestedRef::map_ref_mut
方法来获取对包含的 RefCell
的引用。
对于可变引用,有 NestedRefMut
,就像 RefMut
对 Ref
一样。请注意,只有最内层的引用是可变的,外层的引用对于 NestedRef
和 NestedRefMut
都是不可变的。因此,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