为啥下面的trait定义中,关联类型一定要写Self: 'me。这不是应该是可以编译器自动推导的吗?
trait Iterable {
type Item<'me>
where
Self: 'me;
type Iterator<'me>: Iterator<Item = Self::Item<'me>>
where
Self: 'me;
fn iter<'a>(&'a self) -> Self::Iterator<'a>;
}
后面官方又给了workaround,为啥下面这种写法又不需要写了???
trait IterableTypes {
type Item<'me>;
type Iterator<'me>: Iterator<Item = Self::Item<'me>>;
}
trait Iterable: IterableTypes {
fn iter<'a>(&'a self) -> Self::Iterator<'a>;
}
- https://rust-lang.github.io/generic-associated-types-initiative/explainer/required_bounds.html
- https://github.com/rust-lang/rust/issues/87479
看了下这两个链接,没看懂,有没有老师能通俗易懂的讲解一下
1
共 3 条评论, 1 页
评论区
写评论首先,Gat是泛型关联类型,也就是说Item是个泛型类型(泛型本质上就是个类型占位符),可以添加额外的约束,(声明周期标注是泛型参数的一部分,你可以理解成
T
和'static T
不是一个类型),给Self约束为'me的意思是Item里定义的声明周期'a
一定不能长于'me
,当一个类型实现了这个Iterable Trait,那么他的Item的生命周期一定不会长于类型本身,这个很关键,没有Gat以前,是无法完成这种类型约束的;第二,后面不需要写,是因为给泛型关联类型做约束这件事,是非常有用且常见的,官方以后将提供这种写法,简化代码编写。Gat大大增强了rust的表达能力,让rust得到类似haskell里Type constructor的能力。seems related to https://github.com/rust-lang/rust/pull/122055/