1

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

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()
}

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

这是一个完整示例的链接。

4

1 回答 1

0

在这里找到了解决方法!我可以Ref::map用来获取内部数据:

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

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

于 2020-04-07T17:02:55.413 回答