< 返回版块

QingJuBaiTang 发表于 2024-06-12 12:12

Tags:gat,trait bound

为啥下面的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>;
}
  1. https://rust-lang.github.io/generic-associated-types-initiative/explainer/required_bounds.html
  2. https://github.com/rust-lang/rust/issues/87479

看了下这两个链接,没看懂,有没有老师能通俗易懂的讲解一下

评论区

写评论
freedom967 2024-06-14 14:15

首先,Gat是泛型关联类型,也就是说Item是个泛型类型(泛型本质上就是个类型占位符),可以添加额外的约束,(声明周期标注是泛型参数的一部分,你可以理解成T 'static T不是一个类型),给Self约束为'me的意思是Item里定义的声明周期'a一定不能长于'me,当一个类型实现了这个Iterable Trait,那么他的Item的生命周期一定不会长于类型本身,这个很关键,没有Gat以前,是无法完成这种类型约束的;第二,后面不需要写,是因为给泛型关联类型做约束这件事,是非常有用且常见的,官方以后将提供这种写法,简化代码编写。Gat大大增强了rust的表达能力,让rust得到类似haskell里Type constructor的能力。

ttys3 2024-06-13 15:22

seems related to https://github.com/rust-lang/rust/pull/122055/

zylthinking 2024-06-12 14:31
  1. 将来可以省略, 但现在不支持, 因此你必须这样写 rustc 才不报错
  2. workaround 并非不要求, 而是将位置从 impl Iterable 改成了在 imp IterableTypes 中了
1 共 3 条评论, 1 页