generics - 使用泛型关联类型时,如何指示类型参数上的生存期约束?

标签 generics rust traits lifetime generic-associated-types

我正在尝试为具有泛型类型的结构实现具有泛型关联类型的特征。我正在使用每晚版本1.47.0-nightly (2020-07-20 f9a3086363f214f2b56b)
我有结构S1S2,具有GAT的特征和实现:

#![allow(incomplete_features)]
#![feature(generic_associated_types)]

use core::marker::PhantomData;

struct S1<T>(PhantomData<T>);
struct S2<'a, T: 'a>(PhantomData<(T, &'a ())>);

trait MyTrait {
    type A<'a>;
}

impl MyTrait for S1<f64> {
    type A<'a> = S2<'a, f64>;
}
这行得通,但我想实现通用T的特征:
impl<T> MyTrait for S1<T> {
    type A<'a> = S2<'a, T>;
}
Playground
现在,我需要指出T的生命周期与'a一样长,这是S2的定义所要求的:
error[E0309]: the parameter type `T` may not live long enough
  --> src/lib.rs:14:5
   |
13 | impl<T> MyTrait for S1<T> {
   |      - help: consider adding an explicit lifetime bound...: `T: 'a`
14 |     type A<'a> = S2<'a, T>;
   |     ^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
如何才能做到这一点?
我找到了Generic associated type may not live long enough,但是它可能已经过时了,因为它声称代码尚未实现。但是,为什么像this这样的复杂代码可以编译(并按预期工作)?

最佳答案

impl<T> MyTrait for S1<T> {
    type A<'a> = S2<'a, T>;
}
T在整个实现中都是固定的,包括其生存期。但是,生存期'a在使用时可能会有所不同。如果您需要T的生存期长于'a,那么对于所有可能的生存期都必须为true。因此,如果不更改该实现中的其他内容,T可以拥有的唯一生存期就是'static:
impl<T: 'static> MyTrait for S1<T> {
    type A<'a> = S2<'a, T>;
}
也就是说,除了对静态变量的引用以外,T不能包含任何引用。
还请记住,GAT尚未稳定,并且该功能可能仍不完整。在这个阶段,您可以试用它以了解它可以做什么,但是还没有为现实世界做好准备。

关于generics - 使用泛型关联类型时,如何指示类型参数上的生存期约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63034230/

相关文章:

java - 泛型类的类 <T> 的名称

string - 从 String 转换为具有不同生命周期的 &str

rust - 为另一个特征实现一个特征是什么意思?

java - <T extends SomeClass> 未返回 T 类型的对象。找不到适合我的解决方案

c# - 对象到/从 XML : generic Load and Save

java - 什么是static <T> List<T> methodName (List<? super T> input)

rust - 为什么 cargo build 没有显示具有不兼容依赖项的编译错误?

thread-safety - 无法在线程之间发送 &str,因为它的生存时间不够长

rust - 在没有额外特征的情况下动态调度泛型结构

scala - 访问 trait 中的现有 ActorSystem