gpt4 book ai didi

rust - 使参数泛型时的生命周期错误

转载 作者:行者123 更新时间:2023-12-03 11:42:00 25 4
gpt4 key购买 nike

我已将问题简化为以下代码:

struct Struct<'a, 'b, T> {
a: &'a T,
b: &'b T,
}

trait Trait<'a, 'b, T> {
fn a(&self) -> &'a T;
fn b(&self) -> &'b T;
}

impl<'a, 'b, T> Trait<'a, 'b, T> for Struct<'a, 'b, T> {
fn a(&self) -> &'a T {
self.a
}
fn b(&self) -> &'b T {
self.b
}
}

struct Confused<T> {
field: T,
}

impl<T> Confused<T> {
fn foo<'a, 'b>(&'a self, param: &Struct<'a, 'b, T>) -> &'a T {
param.b();
param.a()
}

fn bar<'a, 'b, U: Trait<'a, 'b, T>>(&'a self, param: &U) -> &'a T {
param.b();
param.a()
}
}

函数 foo没关系,但是当我替换具体类型时 Struct<'a, 'b, T>使用泛型 U: Trait<'a, 'b, T> ,我收到以下错误:

error[E0309]: the parameter type `T` may not live long enough
--> src/lib.rs:31:15
|
24 | impl<T> Confused<T> {
| - help: consider adding an explicit lifetime bound `T: 'b`...
...
31 | param.b();
| ^
|
note: ...so that the reference type `&'b T` does not outlive the data it points at
--> src/lib.rs:31:15
|
31 | param.b();
| ^


添加绑定(bind)的建议 T: 'b对我来说没有意义,因为 'bbar() 的参数.我该如何解决 bar()接受 Trait<'a, 'b, T> 的任何实现作为参数?

最佳答案

当您编写泛型类型时,例如:

struct Foo<'a, T> {
a: &'a T,
}

Rust 自动添加了 T: 'a 类型的隐式限制。 , 因为您对 T 的引用生命周期不能超过 T本身。这是自动的,因为没有它您的类型将无法工作。

但是,当您执行以下操作时:
impl<T> Foo {
fn bar<'a, 'b>() -> &'a T {/*...*/}
}

有一个自动 T: 'a但不是 T: 'b因为没有 &'b T任何地方。

解决方案是自己添加这些约束。在您的代码中,它将是这样的:
impl<T> Confused<T> {
fn bar<'a, 'b, U: Trait<'a, 'b, T>>(&'a self, param: &U) -> &'a T
where
T: 'b, //<--- here!
{
param.b();
param.a()
}
}

关于rust - 使参数泛型时的生命周期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60953455/

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