Rust 为什么向trait添加泛型类型会影响trait对象和关联类型的生存期?

Rust 为什么向trait添加泛型类型会影响trait对象和关联类型的生存期?,rust,traits,lifetime,associated-types,trait-objects,Rust,Traits,Lifetime,Associated Types,Trait Objects,我有以下代码: trait T{ 输入AT; fn foo(和self); } 结构抽象{ t:盒子, } 对抽象的要求{ AT型=AT型; fn foo(和self){ self.t.foo(); } } fn装箱的摘要src/lib.rs:20:5 | 20 | Box::new(AbstractT{t:Box::new(tt)}) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 错误[E0310]:参数类型“GT”的有效期可能不够长 -->src

我有以下代码:

trait T{
输入AT;
fn foo(和self);
}
结构抽象{
t:盒子,
}
对抽象的要求{
AT型=AT型;
fn foo(和self){
self.t.foo();
}
}
fn装箱的摘要src/lib.rs:20:5
|
20 | Box::new(AbstractT{t:Box::new(tt)})
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
错误[E0310]:参数类型“GT”的有效期可能不够长
-->src/lib.rs:20:5
|
19 | fn盒装摘要src/lib.rs:20:5
|
20 | Box::new(AbstractT{t:Box::new(tt)})
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果我从任何地方删除
GT
,它的编译都很好,但是如果使用
GT
,它会失败,并出现一系列终身错误。似乎
GT
的存在不应该影响
dyn T
T::AT
的寿命(因为它们中没有使用它),但显然是这样的。同样地,
dyn T
的寿命不应取决于
GT
AT
的寿命,但显然是这样


是我遗漏了什么,还是这是一个终生的推理问题?

你可能遗漏了什么。Rust自动推断特征对象的生存期界限,对于装箱的特征对象,自动推断的生存期界限是静态的。例如,这是Rust编译器在查看代码时看到的:

trait T{
输入AT;
fn foo(和self);
}
结构抽象{
//请注意下面添加的“+”static

t:BoxWell,t不是一个容器。它既不包含GT也不包含AT。它的使用寿命不应该对GT或AT提出要求,对吗?我不希望GT或AT是静态的。没有GT,rust完全能够理解t的使用寿命不取决于使用寿命。所以我的问题是:1.为什么添加GT会让rust认为t的使用寿命不确定ime受AT生命周期的约束?2.如何解决此问题,例如,AT/GT不受AT约束时,AT有
T:“static
。@FLashM你说得对,AT的生命周期不需要受T的生命周期的约束,我已更新了我的答案以反映这一点。此外,我更新了我的答案,以包含一个不依赖于“static”的解决方案版本保留原始的
TT:“static
约束您不需要向
AbstractT
添加参数以使
装箱的
工作:。但是,您将无法将返回的
填充到另一层
AbstractT
,因为
AbstractT
本身需要
static
。嗯,很有趣,所以限制GT可以减轻AT的要求。但是,关于GT的问题仍然存在。GT寿命不影响T寿命,有没有一种方法可以使装箱的抽象工作而不限制GT寿命?