gpt4 book ai didi

reference - 为包括内部引用在内的方法推断适当的生命周期

转载 作者:行者123 更新时间:2023-11-29 08:15:13 25 4
gpt4 key购买 nike

我正在学习 Rust 并面临编译问题。我简化了我的代码(因此它现在没有任何意义)以在此处发布我的问题。

我有一个 Parent结构填充了 ChildWrapper和一个 Vec<&Child> .但是编译器不会让我设置引用,因为创建的引用不一定比它的内容长。在我看来,在这里设置生命周期 ( pub fn get<'a>(&'a self) -> &'a Child { ) 应该让编译器放心,ref 会存在足够长的时间……但是,不。

如果我取 ChildWrapper来自 Parent我可以让它工作,但我仍然不明白我的代码中有什么问题。

struct Child {
e: bool,
}

impl Child {
pub fn new() -> Child {
Child { e: true }
}
}

struct ChildWrapper {
child: Child,
}

impl ChildWrapper {
pub fn new() -> ChildWrapper {
ChildWrapper { child: Child::new() }
}

pub fn get<'a>(&'a self) -> &'a Child {
&self.child
}
}

struct Parent<'a> {
child_ref: Vec<&'a Child>,
wrapper: ChildWrapper,
}

impl<'a> Parent<'a> {
pub fn new() -> Parent<'a> {
Parent {
child_ref : Vec::new(),
wrapper: ChildWrapper::new(),
}
}

pub fn set_child_ref(&mut self) {
self.child_ref.push(self.wrapper.get());
}
}

fn main() {
let mut parent = Parent::new();
parent.set_child_ref();
}

这是我得到的错误:

error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/main.rs:41:36
|
41 | self.child_ref.push(self.wrapper.get());
| ^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 40:2...
--> src/main.rs:40:2
|
40 | pub fn set_child_ref(&mut self) {
| _____^
41 | | self.child_ref.push(self.wrapper.get());
42 | | }
| |_____^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:41:23
|
41 | self.child_ref.push(self.wrapper.get());
| ^^^^^^^^^^^^
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 32:6...
--> src/main.rs:32:6
|
32 | impl<'a> Parent<'a> {
| ^^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:41:23
|
41 | self.child_ref.push(self.wrapper.get());
| ^^^^^^^^^^^^^^^^^^

我知道如何解决这个问题,这可能是设计不好的迹象(或者可能不是?),但我正在寻找一个解释,并最终寻找一个使用相同架构的解决方案......就像如何为 self.wrapper.get() 显式设置正确的生命周期一样?

谢谢!

最佳答案

To my eyes setting lifetimes here (pub fn get<'a>(&'a self) -> &'a Child {) should reassure the compiler the ref will live long enough... but, nah.

如果您省略它们,您在那里提供的生命周期注解正是 Rust 编译器会推断出的内容,因此这不会产生任何影响。

正如所写,您的 set_child_ref方法已经省略了生命周期,这意味着推断的生命周期是这样的:

impl<'a> Parent<'a> {
pub fn set_child_ref<'b>(&'b mut self) {
self.child_ref.push(self.wrapper.get());
}
}

这行不通。一生'b将由 set_child_ref调用者如何决定使用参数。对self的引用因此可能比生命周期短 'a .这会导致问题,因为对 ChildWrapper 的引用,您存储在 child_ref 中, 是从那个(可能生命周期较短的)引用借来的。

简单的解决方法是说对 self 的引用必须比 'a 长寿,这是 child_ref 中引用的生命周期矢量:

impl<'a> Parent<'a> {
pub fn set_child_ref(&'a mut self) {
self.child_ref.push(self.wrapper.get());
}
}

关于reference - 为包括内部引用在内的方法推断适当的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57991717/

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