"ref mut"模式中"由于需求冲突而无法推断出适当的模式生命周期"

Luk*_*odt 8 lifetime rust

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!(),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

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

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

使用不可变引用,它可以正常工作.

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

Chr*_*son 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!
Run Code Online (Sandbox Code Playgroud)

原因是Rust判断某些东西是否被借用的方式是将生命周期结合在一起 - 但是在这里你明确地说返回值的生命周期是无关的&mut self,这意味着它不会延长借用 - 然后你可以再次借款另一个电话.

这里的解决方案,为了获得原始参考生命周期而不冒第二个&mut参考重叠它的风险,是采取self值(移动),以便它不能再次使用.编译器很满意这个:

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

(游乐场)

  • 是的你可以:https://play.rust-lang.org/?gist = 819f30fafa65066e9f9d8c766cf17106&version=stable&backtrace=0 (4认同)