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