"由于要求冲突,无法推断出适当的模式生命周期。在`ref mut`模式中

时间:2017-02-22 16:27:31

标签: rust lifetime

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!(),
        }
    }
}

Playground

据我所知,这段代码是正确的(返回的引用确实有生命周期'a。但Rust会产生以下错误:

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

Using immutable references,它没有错误。

已经有one similar question,但我很确定在这种情况下没有帮助。

1 个答案:

答案 0 :(得分:5)

看起来冲突就是返回值:

  • 必须至少有效期为'a
  • 一定不能超过&mut self,这只是函数调用的生命周期。

如果允许这样做,它会让你调用它两次并获得对&'a mut内容的两个String个引用:

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

原因在于Rust判断某些东西是否被借用的方式是将生命时间联系在一起 - 但是在这里你明确地说返回值的生命周期与&mut self无关,这意味着它没有& #39; t延长借款 - 然后你可以再次借用另一个电话。

此处的解决方案是,为了获得原始参考生命周期,而不冒第二个&mut引用重叠的问题,是通过值{move}移动self,以便不能使用它再次。编译器很满意:

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

Playground