【发布时间】:2021-05-02 12:01:09
【问题描述】:
任务
获取和设置struct 中字段值的简单数据结构。
问题
以下get_or_set函数错误与
不能将
*self借用为可变的,因为它也被借用为不可变的
代码
struct MyValue<A> {
value: Option<A>,
}
impl<A> MyValue<A> {
fn get(&self) -> &Option<A> {
&self.value
}
fn set<F: FnOnce() -> A>(&mut self, setter: F) -> &Option<A> {
self.value = Some(setter());
self.get()
}
//this function is causing borrow error
fn get_or_set<F: FnOnce() -> A>(&mut self, setter: F) -> &Option<A> {
match self.get() {
None => self.set(setter),
some @ Some(_) => some
}
}
}
为什么会出现错误?
出现错误后,问题是我在第一个 self.get 超出范围之前第二次调用 self.set 并且不允许多次借用。
修复:
请改用if 和else。这里我给self.get打了两次电话,这不太好。
fn get_or_set<F: FnOnce() -> A>(&mut self, setter: F) -> &Option<A> {
if self.get().is_some() {
self.get()
} else {
self.set(setter)
}
}
问题
如何获得借用检查以允许匹配语句也通过?我设置生命周期的尝试没有成功。
fn get_or_set<'a, F: FnOnce() -> A + 'a>(&'a mut self, setter: F) -> &'a Option<A>
【问题讨论】:
-
因为匹配是一种表达方式。
-
(非常相似,但我不确定它是否是这个问题的正确答案,你能用
-Zpolonius测试吗?) -
@Stargateur 刚刚在每晚测试和 -Zpolonius 标志,它解决了这个问题。我建议保留这个问题,因为它们是两个不同的问题,可能有相似的解决方案。
标签: rust