gpt4 book ai didi

rust - 解耦泛型函数中的特征对象生命周期

转载 作者:行者123 更新时间:2023-12-05 02:31:31 24 4
gpt4 key购买 nike

给定:

pub trait SomeTrait {}

pub fn foo<T: ?Sized>(arg1: &mut T, arg2: Box<T>) -> Box<T> {
arg2
}

struct S {
b: Box<dyn SomeTrait>
}

pub fn bar(a0: &mut S, a1: &mut dyn SomeTrait, a2: Box<dyn SomeTrait>) {
a0.b = foo(a1, a2);
}

我有一个通用函数foo。当它在 bar 中使用时,似乎 T 得到了一种 dyn SomeTrait + 'static 似乎强制 arg1 的生命周期为 `'static' 并给出以下错误:

error[E0759]: `a1` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
--> <source>:12:12
|
11 | pub fn bar(a0: &mut S, a1: &mut dyn SomeTrait, a2: Box<dyn SomeTrait>) {
| ------------------ this data with an anonymous lifetime `'_`...
12 | a0.b = foo(a1, a2);
| ^^^^--^^^^^
| |
| ...is used and required to live as long as `'static` here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0759`.
Compiler returned: 1

有没有办法强制 arg1 有一个独立的生命周期?即将它与 'static 分离,以便代码编译?

最佳答案

Is there a way force arg1 to have an independent lifetime? i.e. decouple it from the 'static so that the code compiles?

没有。有一个类型参数 T ,并且在特征对象类型的情况下,类型中嵌入了生命周期界限,因此生命周期界限每次都是相同的 T被使用。

我们做的是放松 'static需求代替...


'static要求来自对 a0.b 的分配. a0.b 的类型是Box<dyn SomeTrait + 'static> : 'static在这里推断,因为生命周期参数必须始终在结构上是显式的。然而,&mut dyn SomeTraitBox<dyn SomeTrait> bar 上的参数取而代之的是匿名生命周期,因此会出现错误。

解决方案是在S 上引入生命周期参数。并在特征对象中使用它,然后调整 bar的签名使生命周期一致。

pub trait SomeTrait {}

pub fn foo<T: ?Sized>(arg1: &mut T, arg2: Box<T>) -> Box<T> {
arg2
}

pub struct S<'a> {
b: Box<dyn SomeTrait + 'a>,
}

pub fn bar<'a>(a0: &mut S<'a>, a1: &mut (dyn SomeTrait + 'a), a2: Box<dyn SomeTrait + 'a>) {
a0.b = foo(a1, a2);
}

关于rust - 解耦泛型函数中的特征对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71503609/

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