gpt4 book ai didi

rust - 如何返回对 RefCell>> 内部数据的引用?

转载 作者:行者123 更新时间:2023-12-03 11:49:16 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How do I return a reference to something inside a RefCell without breaking encapsulation?

(3 个回答)


2年前关闭。




我正在创建一个延迟加载结构:

pub struct LazyData<T, U:FnOnce() -> T> {
data: RefCell<Option<T>>,
generator: RefCell<Option<U>>,
}

impl<T,U:FnOnce() -> T> LazyData<T,U> {
pub fn new(generator:U) -> LazyData<T,U> {
LazyData {
data: RefCell::new(None),
generator: RefCell::new(Some(generator)),
}
}
...
}

我尝试实现一个 get 方法,该方法将返回延迟加载的数据:
pub fn init(&self) {
if self.data.borrow().is_none() {
let generator = self.generator.replace(None).unwrap();
let _none = self.data.replace(Some(generator()));
};
}

pub fn get(&self) -> &T {
self.init();
self.data.borrow().as_ref().unwrap()
}

但是编译器提示说我正在返回一个引用当前函数拥有的数据的值。这个错误对我来说很有意义,但我不确定如何解决它。

Here's a link to a full example.

最佳答案

找到解决方法 here !我可以使用 Ref::map获取内部数据:

pub fn get(&self) -> Ref<T> {
self.init();
Ref::map(self.data.borrow(), |borrow| {
borrow.as_ref().unwrap()
})
}

这个方法现在返回 Ref 而不是 &T,但我认为应该没问题。

关于rust - 如何返回对 RefCell<Option<T>>> 内部数据的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com