"cannot infer an appropriate lifetime for pattern due to conflicting requirements"在"引用"模式中


struct RefWrap<'a> {
    wrap: &'a mut Option<String>,
}
impl<'a> RefWrap<'a> {
    fn unwrap(&mut self) -> &'a mut String {
        match *self.wrap {
            Some(ref mut s) => s,
            None => panic!(),
        }
    }
}

(游乐场)

据我了解,

此代码是正确的(返回的引用确实具有Lifetime 'a。但是RUST会产生以下错误:

error[E0495]: cannot infer an appropriate lifetime for pattern due to conflicting requirements
 --> <anon>:8:18
  |
8 |             Some(ref mut s) => s,
  |                  ^^^^^^^^^

使用不变的参考文献,它起作用而没有错误。

也有一个类似的问题,但我很确定在这种情况下它没有帮助。

似乎冲突是返回值:

  • 必须至少在寿命'a
  • 中有效
  • 不得超过&mut self,这只是函数调用的寿命。

如果允许,它将让您称其为两次,并获得两个&'a mut引用到同一String内容:

let mut w = RefWrap { wrap: &mut s };
let ref1 = w.unwrap();
let ref2 = w.unwrap();  // two mutable references!

原因是生锈的原因是借用某物是通过将一生绑在一起的 - 但是在这里您明确地说,返回价值的寿命与&mut self无关,这意味着它不会扩展借款 - 然后是您可以再次通话再次借。

在这里解决方案,要在不冒险使用第二个&mut参考重叠的情况下将原始参考生命周期取出,就是按值(移动)将self取用,以免再次使用它。编译器对此感到满意:

impl<'a> RefWrap<'a> {
    fn unwrap(self) -> &'a mut String {
        match *self.wrap {
            Some(ref mut s) => s,
            None => panic!(),
        }
    }
}

(游乐场)

最新更新