假设我有一些数据Bar
(例如数据库客户端),我只想创建一次
但对于我的 struct Foo
来说是懒惰的.
struct Bar;
struct Foo {
bar: Option<Bar>
}
为此,我判断该字段是否已初始化;如果未初始化,则运行异步 routine .
然后将 routine 的结果保存为Some
以供以后重复使用.
我知道,这Option::get_or_insert_with美元完全符合这种情况,但我必须 处理异步操作,所以我像这样手动操作.
impl Foo {
pub async fn get_bar(&mut self) -> &Bar {
if let Some(bar) = &self.bar {
return bar;
}
let bar = Self::create_bar().await;
self.bar.insert(bar)
}
/// Long and heavy-resource routine,
/// we want to memoize it.
async fn create_bar() -> Bar {
Bar
}
}
然而,由于不变的and和self.bar
的可变borrow ,这不能被编译.
有什么方法可以正确地做到这一点吗?