gpt4 book ai didi

reference - Rust 生命周期错误预期具体生命周期但发现绑定(bind)生命周期

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

我在使用结构的生命周期参数时遇到问题。我不是 100% 确定如何描述问题,但我创建了一个简单的案例来显示我的编译时错误。

struct Ref;

struct Container<'a> {
r : &'a Ref
}

struct ContainerB<'a> {
c : Container<'a>
}

trait ToC {
fn to_c<'a>(&self, r : &'a Ref) -> Container<'a>;
}

impl<'a> ToC for ContainerB<'a> {
fn to_c(&self, r : &'a Ref) -> Container<'a> {
self.c
}
}

我得到的错误是

test.rs:16:3: 18:4 error: method `to_c` has an incompatible type for trait: expected concrete lifetime, but found bound lifetime parameter 'a
test.rs:16 fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17 self.c
test.rs:18 }
test.rs:16:48: 18:4 note: expected concrete lifetime is the lifetime 'a as defined on the block at 16:47
test.rs:16 fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17 self.c
test.rs:18 }
error: aborting due to previous error

我已经尝试了很多变体,但就是无法编译这个东西。我在这里找到了另一篇文章 ( How to fix: expected concrete lifetime, but found bound lifetime parameter ),但似乎是在绕过问题而不是解决问题。我真的不明白为什么会出现这个问题。 &Ref 是通过 moves 传递的,所以它应该能正常工作?

有什么想法吗?感谢所有帮助。

最佳答案

让我们比较一下这两个定义。一、trait方法:

fn to_c<'a>(&self, r: &'a Ref) -> Container<'a>;

和实现:

fn to_c(&self, r: &'a Ref) -> Container<'a>;

看出区别了吗?后者没有 <'a><'a> 已在别处指定;它具有相同的名称这一事实并不重要:它完全是另一回事。

从功能上讲,您的特征定义表示返回的容器内部将有一个对 r 中的内容的引用,但 self 中没有任何内容。它可以在方法内部使用 self,但它可能不会在返回值中存储对它的任何引用。

但是,您的方法定义使用的是 'a,它将 r 和返回的 Container 的生命周期与 self 联系起来(也就是说,对象本身,而不是引用——&'ρ₁ T<'ρ₂> 中的 ρ2——这是一个微妙但有时很重要的区别), 而特征定义没有这种联系。

可以通过在实现中的方法定义中插入<'a>来使两者匹配。但请记住,这是从 'a 隐藏 ContainerB<'a> ;它是同一个 'a!我们最好给它起另一个名字;为方便起见,我将以相反的方式进行更改,在 impl 而不是方法上更改它(两者都可以):

impl<'b> ToC for ContainerB<'b> {
fn to_c<'a>(&self, r: &'a Ref) -> Container<'a> {
self.c
}
}

但现在您当然遇到了问题:返回值的类型为 Container<'b>(因为这是 c 中的字段 ContainerB<'b> 的类型),但您的签名需要 Container<'a>(使用来自 r 的引用,而不是来自 self 的引用)。

解决它的一种方法是在特征定义和实现中将 &self 的生命周期指定为 'a;在实现中,这将要求 'b 大于或等于 'a(由于您已经成功地将生命周期为 'a 的引用引用到生命周期为 'b 的对象,并且该对象必须比引用长寿)等等由于子类型化('a'b 的子类型),Container<'b> 将被安全地强制转换为 Container<'a>

这些人生大事,不熟是很难想的;但随着时间的推移,它们会变得很自然。

关于reference - Rust 生命周期错误预期具体生命周期但发现绑定(bind)生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24847331/

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