Rust 获取和设置结构中的值时出现多次借用错误 任务

Rust 获取和设置结构中的值时出现多次借用错误 任务,rust,Rust,一种简单的数据结构,用于获取和设置struct中字段的值 问题 以下获取或设置功能错误 不能将*self作为可变项借用,因为它也是作为不可变项借用的 代码 struct MyValue{ 价值:期权, } impl MyValue{ fn获取(&self)->选项(&O){ &自我价值 } fn设置一个>(&mut self,setter:F)->&选项{ self.value=Some(setter()); self.get() } //此函数导致借用错误 fn获取或设置一个>(&mut se

一种简单的数据结构,用于获取和设置
struct
中字段的值

问题 以下
获取或设置
功能错误

不能将
*self
作为可变项借用,因为它也是作为不可变项借用的

代码
struct MyValue{
价值:期权,
}
impl MyValue{
fn获取(&self)->选项(&O){
&自我价值
}
fn设置一个>(&mut self,setter:F)->&选项{
self.value=Some(setter());
self.get()
}
//此函数导致借用错误
fn获取或设置一个>(&mut self,setter:F)->选项(&U){
匹配self.get(){
无=>self.set(setter),
some@some())=>some
}
}
}
为什么会发生错误? 错误发生后,问题是我在第一次调用
self.get
之前第二次调用
self.set
超出范围,不允许多次借用

修正: 改用
if
else
。我给self打了两次电话,这可不好

fn获取或设置A>(&mut self,setter:F)->&Option{
如果self.get()是某个(){
self.get()
}否则{
自我设定(设定器)
}
}
问题: 如何获得借阅支票以允许匹配语句也通过?我试图设定生命周期的尝试没有成功

fn获取或设置(&'a mut self,setter:F)->&'a选项

您可以这样编写函数:

fn获取或设置1 A>(&mut self,setter:F)->&Option{
匹配*self.get(){
无=>self.set(setter),
_=>&self.value,
}
}

真管用!非常感谢。但这太奇怪了。我不明白这背后的原因。这个错误说我借用了
self
两次,指向
None
的主体,但第三次调用
self
时,使用
\uu=>&self.value
修复了它:s
match self.get()
创建了一个临时变量,该变量引用了从
get
返回的
&Option
作为共享引用,然后,当您调用self.set(setter)
时,您再次尝试借用它,这一次是可变的。当您取消引用时,引用将不再保留。在
if
中,您不持有引用,因为您调用了
is_some
方法并得到
bool
结果。检查这里的第二段:问题表明调用两次
self.get()
是“不好的”,但这个答案基本上是一样的,只是它通过直接访问
self.value
来内联第二次调用(如果有意的话,这样会破坏封装)。@user4815162342是的,我没有注意到这一点。
-Zpolonius
标志是唯一的解决方案吗?@船长好奇,我不会把
-Zpolonius
算作解决方案,因为它在stable上不可用。代码使用该标志表示问题不在于代码,而在于当前的借用检查器,并且该问题可能会在将来的某个版本中消失。但普罗尼尔斯仍在开发中,目前还没有公开的时间表来说明它何时能被广泛使用。看看其他类似的问题,调用
get()
两次似乎是唯一没有不安全的解决方案。如果您对不安全的解决方案感兴趣,也可以编写一个。因为match是一个表达式。这是否回答了您的问题?(非常相似,但我不确定这是这个问题的正确答案,你能用
-Zpolonius
?)测试一下吗@Stargateur刚刚测试过,并且每晚都有-Zpolonius标志,它解决了这个问题。我建议将这个问题留待讨论,因为它们是两个不同的问题,可能有类似的解决方案。