&'a mut Stri-6ren">
gpt4 book ai didi

rust - "cannot infer an appropriate lifetime for pattern due to conflicting requirements"模式中的 `ref mut`

转载 作者:行者123 更新时间:2023-11-29 07:45:39 24 4
gpt4 key购买 nike

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 ,但我很确定它在这种情况下没有帮助。

最佳答案

看起来冲突的地方在于返回值:

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

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

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

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

( Playground )

关于rust - "cannot infer an appropriate lifetime for pattern due to conflicting requirements"模式中的 `ref mut`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42397056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com